目标:将本人写博客时候的截图保存到桌面的图片  

执行保存到指定文件进行整理

并写入数据库

先看最终的目录结构:

package.json文件:

{
"name": "zqz",
"dependencies": {
"mysql": "^2.10.2",
"node-schedule": "^1.1.0"
}
}

通过npm install node-schedule --save //--save的作用是将其加入package.json的dependencies(依赖项中)

2个依赖项:

node-schedule https://github.com/node-schedule/node-schedule 定时器

mysql https://github.com/felixge/node-mysql mysql

app.js文件:

var schedule = require('node-schedule');
var mysql = require('mysql');
var fs = require('fs');
const desktopPath = 'C:/Users/Administrator/Desktop/';
const targetPath = 'F://Blog_ScreenShot//';
const metaInfo = 'blog';
var operationType = {
0 : '插入',
1 : '删除',
2 : '修改',
3 : '查询'
} /**
* 轮询桌面
* @return {[type]} [description]
*/
function timePoll(){
console.log('--------[开始轮询]----------')
schedule.scheduleJob('30 * * * * *', function(){
visitDesk();
console.log('每分钟的30s都会执行!:' + (new Date).toLocaleTimeString());
});
} /**
* 访问桌面
* @return {[type]} [description]
*/
function visitDesk(){
console.log('--------开始访问桌面----------')
fs.readdir(desktopPath,function(err, files){
if (err) {
return console.error(err);
} files.forEach( function (file){
if(file && judgeImage(file)){
saveImageToFile(file);
}else{
console.log('桌面无资源!');
return;
} });
});
} /**
* 判断文件类型,取出我们需要的png图片
* @return {[type]} [description]
*/
function judgeImage(file){
var postfix = getPostfix(file);
if(postfix === 'png' && file.indexOf(metaInfo) > -1){
return file;
}
} function getPostfix(file){
var dotIndex = file.indexOf('.');
var fileLen = file.length;
return file.substring(dotIndex+1,fileLen);
} /**
* 将获取的图片存入
* pipe,它以用来把当前的可读流和另外一个可写流连接起来。可读流中的数据会被自动写入到可写流中
* @return {[type]} [description]
*/
function saveImageToFile(file){
var fileReadStream = fs.createReadStream(desktopPath + file);
var lastPath = targetPath + createDateFolder();
if(!isFolderHave(lastPath)){
createLastFloder(lastPath);
}
var fileWriteStream = fs.createWriteStream(lastPath + file);
fileReadStream.pipe(fileWriteStream);
fileWriteStream.on('close',function(){
console.log('复制成功!');
deleteDeskImage(file);
//写入数据库
connectMysql(file, lastPath, '0');
})
} /**
* 删除桌面文件
* @param {[type]} file [description]
* @return {[type]} [description]
*/
function deleteDeskImage(file){
fs.unlink(desktopPath + file, function(){
console.log('删除成功!')
})
} /**
* 以系统时间创建文件夹/年月日
* @return {[type]} [description]
*/
function createDateFolder(){
var day = (new Date).getDate();
var month = (new Date).getMonth()+1;
var year = (new Date).getFullYear();
return year + '_' + month + '_' + day + '//';
} /**
* 判断文件夹是否存在
* @return {[type]} [description]
*/
function isFolderHave(lastPath){
fs.exists(lastPath, function(exists){
if(exists){
return true;
}else{
return false;
}
})
} /**
* 创建最终目标文件夹
* @param {[type]} lastPath [description]
* @return {[type]} [description]
*/
function createLastFloder(lastPath){
fs.mkdir( lastPath, function(){
console.log('[文件夹创建]-' +lastPath + "成功!");
})
} /**
* 连接数据库
* @return {[type]} [description]
*/
function connectMysql(picname, picurl, time){
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'root',
database : 'nodejs'
}); connection.connect(function(err){
if(err){
console.log(err);
return;
}
console.log('连接成功!');
}); saveToDataBase(connection, picname, picurl); connection.end(function(err){
if(err){
return;
}
console.log('关闭连接成功!');
});
} /**
* 将数据存入数据库,进行持久化
* @return {[type]} [description]
*/
function saveToDataBase( connection, picname, picurl){
var querySql = 'INSERT INTO scaingDeskImg(Id,picname,picurl,time) VALUES(0,?,?,?)'; //注意存入数据库中的数据如果有中文会出现,乱码错误,导致执行失败!
var querySql_Params = [picname, targetPath+picurl+picname, new Date]; operationDataBase( connection,querySql, querySql_Params, operationType['0']);
} /**
* 对数据库的操作
* @return {[type]} [description]
*/
function operationDataBase( connection, querySql, querySql_Params,flag){
connection.query( querySql, querySql_Params, function (err, result) {
if(err){
console.log('[' + flag + 'ERROR] - ',err.message);
return;
} console.log(flag + '成功!');
});
} timePoll();

结果:

涉及的知识:

 定时器:

schedule.scheduleJob('30 * * * * *', function(){
visitDesk();
console.log('每分钟的30s都会执行!:' + (new Date).toLocaleTimeString());
});

定时器中的第一个参数:

 秒  分   时    日   月    周 

*    *    *    *    *    *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ |
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── month (1 - 12)
│ │ │ └────────── day of month (1 - 31)
│ │ └─────────────── hour (0 - 23)
│ └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)

例如:

30 * * * * * 就表示每分钟的30秒执行

30 2 * * * * 就表示每小时的2分30秒执行

30 2 21 * * * 就表示每天的21点2分30秒执行

30 2 21 8 * * 就表示每月的8号21点2分30秒执行

...依次类推

读写文件:

//从桌面将文件读入流

var fileReadStream = fs.createReadStream(desktopPath + file);

//从要存入的文件创建写入流

var fileWriteStream = fs.createWriteStream(lastPath + file);

//最后通过node的pipe()的方法连接两个数据流,犹如管道一样将数据读入写入

  fileReadStream.pipe(fileWriteStream);

具体的可以参见API。

Node+fs+定时器(node-schedule)+MySql的更多相关文章

  1. paip.最好的脚本语言node js 环境搭建连接mysql

    paip.最好的脚本语言node js 环境搭建连接mysql #====下载node...走十一个exe..容易的.. 1 #0----Hello world   .js 2 #---------模 ...

  2. 解决node fs.writeFile 生成csv 文件乱码问题

    解决node fs.writeFile 生成csv 文件乱码问题: fs.writeFile('xxx.csv', '\ufeff' + 要传入的数据, {encoding: 'utf8'}); \u ...

  3. Solve Error: node postinstall sh: node: command not found

    When install the yeoman using the following command: npm install -g yo You might have the following ...

  4. 一起来学node.js吧 node school简介

    node.js这几年火爆的简直丧心病狂,去lagou.com查查node.js的职位,那叫一个多. 要说火爆到什么程度,竟然有一个网站专门去教大家学习node.js, Node School. 进去逛 ...

  5. 获取所有树叶子节点 注册添加事件 if ($(node).tree('isLeaf', node.target)) 是否叶子节点

    //获取所有树叶子节点 注册添加事件 if ($(node).tree('isLeaf', node.target)) 是否叶子节点 $(function () { $('.easyui-tree') ...

  6. .NET程序员也学Node.js——初识Node.js

    清明在石门休了八天假,一眨眼,4月又到中旬了...看到.NET在天朝彻底沦陷而又无能为力,我开始尝试去学习一些新的东西来充实自己,我自然是打死不会去学java的,没有为什么,于是乎,最近开始学习一些前 ...

  7. node基础篇一:node介绍、node http、node event 课堂(持续)

    最近工作一直很忙,没时间更新,谅解,这次准备更新一次node教程,本课堂将持续更新,每周坚持更新一到两章,希望对大家有一些小帮助吧: 一.首先什么是node? 1/Node.js 是一个基于 Chro ...

  8. elasticsearch节点(角色)类型解释node.master和node.data

    在生产环境下,如果不修改elasticsearch节点的角色信息,在高数据量,高并发的场景下集群容易出现脑裂等问题. 默认情况下,elasticsearch集群中每个节点都有成为主节点的资格,也都存储 ...

  9. elasticsearch负载均衡节点——客户端节点 node.master: false node.data: false 其他配置和master 数据节点一样

    elasticSearch的配置文件中有2个参数:node.master和node.data.这两个参 数搭配使用时,能够帮助提供服务器性能. 数据节点node.master: false node. ...

随机推荐

  1. 通过一个demo了解Redux

    TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...

  2. 如何创建Vim Dotfile?

    Dotfile是电脑系统里的隐藏文件,它是专门给更高级的用户,如开发者.程序员或工程师使用的,让他们用来调整系统.如何创建Vim-Dotfile? 可以参考以下步骤: 1. 首先,你要检查一下.vim ...

  3. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  4. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

  5. javascript 判断参数类型大全

    js 判断类型的在开发中是很常用的,因为js 是弱类型的语言,var 可以接受任何形式的类型,但是在真正的开发中,我们需要根据不同类型做不同的处理,所以这个是必须的精通. 首先需要知道 typeof这 ...

  6. 讓TQ2440也用上設備樹(1)

    作者:彭東林 郵箱:pengdonglin137@163.com QQ:405728433 開發板 TQ2440 + 64MB 內存 + 256MB Nand 軟件 Linux: Linux-4.9 ...

  7. Openfiler配置RAC共享存储

    将 Openfiler 用作 iSCSI 存储服务器,主要操作步骤如下: 1.设置 iSCSI 服务 2.配置网络访问 3.指定物理存储器并对其分区 4.创建新的卷组 5.创建所有逻辑卷 6.为每个逻 ...

  8. 【用户交互】APP没有退出前台但改变系统属性如何实时更新UI?监听系统广播,让用户交互更舒心~

    前日,一小伙伴问我一个问题,说它解决了半天都没解决这个问题,截图如下: 大概楼主理解如下: 如果在应用中有一个判断wifi的开关和一个当前音量大小的seekbar以及一个获取当前电量多少的按钮,想知道 ...

  9. 【微信小程序开发•系列文章六】生命周期和路由

    这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...

  10. H3 BPM让天下没有难用的流程之技术特性

    一.集成性  H3 BPM可以与其它系统进行多个层面的集成,满足企业的针对不同系统的集成需求. 图:多种集成维度 Ø  用户集成 可与企业现有系统进行组织架构同步或调用,也可以直接与AD 进行集成. ...