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

于是就找到了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. [Luogu2973][USACO10HOL]赶小猪

    Luogu sol 首先解释一波这道题无重边无自环 设\(f_i\)表示\(i\)点上面的答案. 方程 \[f_u=\sum_{v,(u,v)\in E}(1-\frac PQ)\frac{f_v}{ ...

  2. 【learning】一般图最大匹配——带花树

    问题描述 ​ 对于一个图\(G(V,E)\),当点对集\(S\)满足任意\((u,v)\in S\),均有\(u,v\in V,(u,v)\in E\),且\(S\)中没有点重复出现,我们称\(S\) ...

  3. oracle 裸设备划分 --centos6.5

    主题思想:物理卷PV->卷组VG->逻辑卷LV(类型:raw)->添加表空间 操作过程 vg_orcl         8g 一:划分 二:创建裸设备 方法1:目前最常用的方法 #c ...

  4. gulp配置

    /* gulp配置 */ /* gulp配置 */ var gulp = require('gulp'), concat = require('gulp-concat'), rename = requ ...

  5. CyQ.data MDataTable

    前言 以前一两个月才出一篇,这三天有点变态地连续1天1篇(其实都是上周末两天写好的存货). 短期应该没有新的和此框架相关的文章要写了,这应该是最后一篇,大伙且看且珍惜. 前两篇讲数据库读写分享和分布式 ...

  6. route路由的顺序问题了数据包的转发流程

    2018-02-28   15:29:26 [root@linux ~]# routeKernel IP routing tableDestination     Gateway           ...

  7. window.open打开文件乱码

    问题:刚开始使用window.open在IE兼容模式下打开文件下载出现乱码. 一开始以为是文件名是中文导致的.然后使用a标签的download属性更改文件名解决. <a class=" ...

  8. Spring配置文件中如何使用外部配置文件配置数据库连接

    直接在spring的配置文件中applicationContext.xml文件中配置数据库连接也可以,但是有个问题,需要在url后带着使用编码集和指定编码集,出现了如下问题,&这个符号报错-- ...

  9. vue技术解析二之组件通信

    --------------------------动画效果----------------------------------- <transition name="router-f ...

  10. MYSQL数据库学习十三 使用MySQL常用函数

    13.1 字符串函数 对于针对字符串位置的操作,第一个位置被标记为1. 函数 功能 CONCAT(str1,str2...strn) 连接字符串str1.str2....strn INSERT(str ...