最近维护一个项目。每次改完东西,都要上传到服务器。然后有时候就忘记一些东西,于是就想有没有可以方法能监听文件的改变。然后我再利用程序把更改的文件一键上传到服务器。

于是就找到了nodejs 的chokidar模块。 然后利用redis的set集合。因为我们频繁更改。如果用普通的字符 会增加比较。set是一个集合,里面的元素都是不重复的。正好可以利用这个特性。帮我们记录更改的记录文件。删除的时候,然后删掉set中的文件。目前只做了增加或修改的文件提交,如果本地删除的 不会同步到服务器。

监听本地文件的代码如下

const chokidar = require('chokidar')
const redis = require("redis"),
client = redis.createClient(); let watcher = null
let ready = false
const key = "modifyFiles";
let watch = function (filepath) {
// 文件新增时
function addFileListener(path_) {
if (ready) {
client.sadd(key,path_);
console.log('文件', path_, 'has been added')
}
}
function addDirecotryListener(path_) {
if (ready) {
console.log('目录', path_, 'has been added')
}
} // 文件内容改变时
function fileChangeListener(path_) {
client.sadd(key,path_);
console.log('文件', path_, '已经修改')
} // 删除文件
function fileRemovedListener(path_) {
client.srem(key,path_)
console.log('文件', path_, '被删除了')
} // 删除目录时
function directoryRemovedListener(path_) {
console.info('目录', path_, '被删除了')
} if (!watcher) {
watcher = chokidar.watch(filepath)
}
watcher
.on('add', addFileListener)
.on('addDir', addDirecotryListener)
.on('change', fileChangeListener)
.on('unlink', fileRemovedListener)
.on('unlinkDir', directoryRemovedListener)
.on('error', function (error) {
console.info('发生了错误:', error);
})
.on('ready', function () {
console.info('准备监听');
ready = true
})
}
watch("E:\\work\\www.cccc.com\\")

上传到服务器

上传到服务器:我们需要读取set集合中的数据,然后将本地的目录和远程目录映射,利用sftp传输到指定的文件。代码如下

 var path, fs, redis, client, node_ssh, ssh
node_ssh = require('node-ssh')
ssh = new node_ssh()
fs = require('fs')
path = require('path')
redis = require("redis")
client = redis.createClient() //redis 集合key
const key = "modifyFiles"; //远程目录
const remote_path = "/home/wwwroot/www.ccc.com/"; //本地目录
const local_path = "E:/work/www.ccc.com/" let uploadFiles = [{
"local": "",
"remote": ""
}]; //远程server信息
const serverConfig = {
host: 'x.x.x.x',
username: 'admin',
password: 'admin',
port: 22
}
//读取redis中的set
client.smembers(key, (error, data)=> {
if (error == true) {
return
} //链接ssh
ssh.connect(serverConfig)
.then(() => { if(data.length == 0) {
return
} // 组装数据
data.map(function(item, index){
let path = item.replace(/\\/g, "/");
let temp = {
local: path,
remote: path.replace(local_path, remote_path)
}
uploadFiles[index] = temp;
}) //上传文件
ssh.putFiles(uploadFiles).then(function () {
console.log("文档上传成功了!!!!")
client.srem(key,data)
}, function (error) {
console.log(error)
}) }) })

利用Node的chokidar 监听文件改变的文件。的更多相关文章

  1. Oracle LISTENER 主机名修改为IP地址后LISTENER无法监听到实例 oracle监听错误与hosts文件配置

    为什么listener.ora文件里面HOST后面到底应该输入IP地址还是主机名.我的经验告诉我,这边最好使用主机名.很多的时候,一个机器绑定的不只一个IP地址,如HOST后面是IP地址,那么ORAC ...

  2. 实时监听 JavaScript改变 input 值 input输入框内容 value 变化实时监听

    思路:通过setInterval()方法去定时对比新旧值 当时候JavaScript的onchange 和onpropertychange(注意ie版本) 监听输入框input时间,人为改变值是可以触 ...

  3. 监听 input上传文件, 获取文件名称,

    <div class="import-box pr" > <span class="model-address-txt">导入文件:&l ...

  4. android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人

    要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上 ...

  5. node.js绑定监听事件EventEmitter类

    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下: // 引入 events 模块 var events = r ...

  6. 利用spring的ApplicationListener监听某一类事件的发生

    1.ApplicationListener在使用过程中可以监听某一事件的发生,可以做出相应的处理,这个方式不常用,但是在特殊情况下面还是有用的. 2.导包pom.xml <project xml ...

  7. 利用bootstrap制作滚动监听

    滚动监听(Scrollspy)插件,即自动更新导航插件,会根据滚动条的位置自动更新对应的导航目标. 在这里,需要引入三个文件:bootstrap.min.css      jquery-3.3.1.j ...

  8. 20180530利用Maxwell组件实时监听Mysql的binlog日志

    转自:https://blog.csdn.net/qq_30921461/article/details/78320750 http://kafka.apache.org/quickstart htt ...

  9. C# 利用socekt做到http监听,怎么样才能做到高性能

    c#原始提供了http的监听的类HttpListener,实现了简单的http.文章地址<C# 控制台或者winform程序开启http的监听状态> 但是经过我测试,这个HttpListe ...

随机推荐

  1. 论文笔记(9):Multiscale Combinatorial Grouping

    本文大致脉络: 对每张图片,作者首先使用 P. Doll´ar and C. Zitnick. Structured forests for fast edge detection. ICCV , 2 ...

  2. weblogic的使用

    1.怎么修改weblogic的端口 创建好域之后,去域的下面找到config.xml文件,在里面加上<listen-port>80</listen-port>即可,访问时不用加 ...

  3. CLOB型转成字符型

    //oracle.sql.Clob类型转换成String类型 public static String ClobToString(Clob clob) { String reString = &quo ...

  4. CSS备战春招の二

    CSS:层叠样式表 CSS注释形式:/*  */ class 选择器有别于id选择器,class可以在多个元素中使用 id属性不要以数字开头,以数字开头在特定浏览器中不起作用 类名的第一个字符不要使用 ...

  5. python 全栈开发,Day3

    python之集合,深浅copy 一.集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把 ...

  6. Git分支(3/5) -- 禁用 Fast Forward 合并

    添加一个分支, 并且换到该分支: git checkout -b add-text 然后我再index.html里面添加点文字, 并commit. 然后再修改README.md, 添加文字, comm ...

  7. 《Java2 实用教程(第五版)》学习指导

    <Java2 实用教程(第五版)> 第1章Java入门 主要内容:P1 1.1Java的地位:P1 1.2Java的特点:P2 1.3安装JDK:P5 1.4Java程序的开发步骤:P8 ...

  8. Mysql5.7动态修改innodb_buffer_pool_size

    SELECT @@innodb_buffer_pool_size,@@innodb_buffer_pool_chunk_size,@@innodb_buffer_pool_instances; SET ...

  9. 笔记:Hibernate 持久化类标注说明

    持久化类标注 标注 @Entity:注解声明该类是一个Hibernate的持久化类 标注 @Table:指定该类映射的表 参数 name:指定映射数据库表的名称 参数 uniqueConstraint ...

  10. window7 安装sass和compass

    官网有详细的介绍,但是安装时候还是出现了一些小问题. 首先下载Rudy,然后根据提示勾选加入环境变量,由于第一次使用,我就选择了" msys2 base installlation" ...