利用Node的chokidar 监听文件改变的文件。
最近维护一个项目。每次改完东西,都要上传到服务器。然后有时候就忘记一些东西,于是就想有没有可以方法能监听文件的改变。然后我再利用程序把更改的文件一键上传到服务器。
于是就找到了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 监听文件改变的文件。的更多相关文章
- Oracle LISTENER 主机名修改为IP地址后LISTENER无法监听到实例 oracle监听错误与hosts文件配置
为什么listener.ora文件里面HOST后面到底应该输入IP地址还是主机名.我的经验告诉我,这边最好使用主机名.很多的时候,一个机器绑定的不只一个IP地址,如HOST后面是IP地址,那么ORAC ...
- 实时监听 JavaScript改变 input 值 input输入框内容 value 变化实时监听
思路:通过setInterval()方法去定时对比新旧值 当时候JavaScript的onchange 和onpropertychange(注意ie版本) 监听输入框input时间,人为改变值是可以触 ...
- 监听 input上传文件, 获取文件名称,
<div class="import-box pr" > <span class="model-address-txt">导入文件:&l ...
- android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人
要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上 ...
- node.js绑定监听事件EventEmitter类
Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下: // 引入 events 模块 var events = r ...
- 利用spring的ApplicationListener监听某一类事件的发生
1.ApplicationListener在使用过程中可以监听某一事件的发生,可以做出相应的处理,这个方式不常用,但是在特殊情况下面还是有用的. 2.导包pom.xml <project xml ...
- 利用bootstrap制作滚动监听
滚动监听(Scrollspy)插件,即自动更新导航插件,会根据滚动条的位置自动更新对应的导航目标. 在这里,需要引入三个文件:bootstrap.min.css jquery-3.3.1.j ...
- 20180530利用Maxwell组件实时监听Mysql的binlog日志
转自:https://blog.csdn.net/qq_30921461/article/details/78320750 http://kafka.apache.org/quickstart htt ...
- C# 利用socekt做到http监听,怎么样才能做到高性能
c#原始提供了http的监听的类HttpListener,实现了简单的http.文章地址<C# 控制台或者winform程序开启http的监听状态> 但是经过我测试,这个HttpListe ...
随机推荐
- canvas练手项目(二)——各种操作基础
想想应该在canvas上面作画了,那么就不得不提到事件了. (打着canvas的旗号,写着mouse事件.挂羊头卖狗肉!哈哈哈哈哈~) 先来看一看HTML事件属性,我们要用的就是Mouse事件,就先研 ...
- Linux内核调优参数说明
该脚本是我常用的系统安装后执行脚本,包括开机启动服务.内核.SSH优化. !/bin/sh 服务优化,(sshd.network.crond.syslog.rsyslog)服务保持默认开机启动 Ser ...
- 设置mysql密码 Access denied 问题
原文:http://www.upwqy.com/details/31.html 在Mac上安装完mysql以后 在终端执行 /usr/local/mysql/bin/mysql 可以直接进入.但是在设 ...
- 关于在Django中Json无法序列化datetime的解决办法
我们在网页设计时经常会在前端和后台进行交互,前端回传的方法可以时redirect一个地址加上显式的参数,第二个办法就是使用Ajax结构.那么在传到view函数中进行处理后是需要通过Json格式进行返回 ...
- Vue-表单输入绑定
>>>>>>> html <div id="app" > <!-- 输入框绑定 --> <input v-m ...
- IE浏览器右键菜单插件开发(下篇)——如何用c#安装、卸载IE右键插件
建立Installer安装类,如图: 代码如下: using Microsoft.Win32; using ResourceShare.UserClient.Common; using System; ...
- 漫谈PID——实现与调参
闲话: 作为一个控制专业的学生,说起PID,真是让我又爱又恨.甚至有时候会觉得我可能这辈子都学不会pid了,但是经过一段时间的反复琢磨,pid也不是很复杂.所以在看懂pid的基础上,写下这篇文章,方便 ...
- NEO从入门到开窗(1) - 一个智能合约的诞生
一.啰嗦两句 最近一直都在研究区块链,BitCoin,Etherenum, Hyper Ledger Fabric还有今天的主角小蚂蚁,当然出名以后改了一个艺名叫NEO.区块链大部分都是用Golang ...
- freemarker的classic_compatible设置,解决报空错误
前段时间接触freemaker时,本来后端写各接口运行正常,但加入了模板后,频繁报空指针问题,整了许久,最后还是请教了别人解决了这个问题,现在记录下来,方便以后碰到了可以查阅. 错误样例如下: ERR ...
- 托管ASP.NET Core应用程序到Windows服务中
由于公司程序前置Nginx反向代理,所以在Windows中部署过程中没有采用IIS托管.Net Core应用,一直采用控制台dotnet命令直接运行.但是测试过程中,发现程序内Session一直无法覆 ...