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

于是就找到了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. LCT总结

    LCT总结 类比树剖,树剖是通过静态地把一棵树剖成若干条链然后用一种支持区间操作的数据结构维护(比如线段树.树状数组),而LCT是动态地去处理这个问题. 大家都知道树剖用线段树维护,而LCT用\(sp ...

  2. 关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  3. webpack4: compilation.mainTemplate.applyPluginsWaterfall is not a function 解决方法

    今天捣鼓webpack4踩到一个弥天大坑:使用html-webpack-plugin打包html的时候一直报 compilation.mainTemplate.applyPluginsWaterfal ...

  4. windows下的react-native 开发环境搭建

    本教程用安卓手机作为演示. 首先安装jdk.本教程基于jdk1.8,安装时有一点要特别注意:jdk和jre必须装到不同目录下,否则初始化react-native项目时大概率报tools.jar not ...

  5. 怎么修改无法启动的docker容器的配置?

    原因: 由于错误的配置导致原来可以启动的docker容器不能启动了.相信很多人的做法是删除容器重建一个,这样也是可以的,但是你的配置和插件就得重新安装,非常麻烦.最小的代价当然是修改原来的配置让他能启 ...

  6. 设计模式——观察者模式(C++实现)

    #include <iostream> #include <vector> #include <algorithm> #include <iterator&g ...

  7. 使用git指令下载github仓库代码(笔记)

    通过Git指令下载源码 Git概念说明 ​ 三种状态:修改状态.暂存状态和Git仓库 ​ 基本的Git工作流程: ​ 在工作目录中修改文件 ​ 暂存文件,将文件的快照放入暂存区域 ​ 提交更新,找到暂 ...

  8. 笔记:Maven 反应堆

    在一个多模块的Maven项目中,反应堆(Reactor)是指所有模块组成的一个构建结构,对于单个模块的项目,反应堆就是该模块本身,但对于多模块项目来说,反应堆就包含了各模块之间继承与依赖的关系,从而能 ...

  9. 前端的UI设计与交互之图标篇

    图标是具有指代意义的图形,也是一种标识.通过使用图标表达命令,强调状态,表示产品或类别.为了系统及跨平台之间图形认知保持一致, 图标在设计和使用时有以下两个原则点需要注意:简单的图形语言以及高辨识度. ...

  10. python基础学习笔记二之列表

    1.列表 ①列表的创建: ②列表的查询(索引): ③列表的切片操作: 此处要注意到:返回索引0到3的元素,顾头不顾尾. ④列表的增加: s.append()  #直接在结尾追加 s.insert()  ...