利用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 ...
随机推荐
- Kruskal重构树(货车运输)
... 和Kruskal生成树一样 本来是u,v连一条f的边 现在变成新建一个点,点权为f,u v都像它连无边权的边 (实际上应该是u的根和v的根) 这样树有一些性质: 1.二叉树 2.原树与新树两点 ...
- struct 2 基本知识
(最近在写一个ssh的项目,虽然看网上好像都说ssh已经过气了...之前虽然老师有上过这个课,我还做了一个PPT专门讲这个来着,但果然没有实践经验还是不容易理解.在参照一个项目写ssh时候,表示四脸蒙 ...
- prompt 方法显示输入对话框
prompt 方法显示输入对话框 原理: prompt() 方法用于与用户交互,提示用户输入信息的对话框. prompt(str1,str2);此方法包含两个属性: str1:用于提示用户输入的信息. ...
- 自创最精简的python装饰器
个人心血原创,欢迎转载,请注明作者和出处.否则依法追究法律责任!!!! author:headsen chen date:2018-03-21 10:37:52 代码: 代码解析过程:1,def ...
- SoupUI安装
(仅供学习,严禁用于商业应用) 今天开始在公司需要做websocket接口测试,以前从来没有接触过,对美好生活充满了向往啊,今天从安装开始吧! 至于什么是websocket自行百度,我也是百度出来的, ...
- NMEA0183
NMEA简介 NMEA是全国海洋电子协会(National Marine Electronics Association):国际海上电子协会(National Marine Electronics A ...
- svn版本提交冲突问题解决详解
svn冲突文件解决方法 工具/原料 svn客户端 方法/步骤 1 通过SVN客户端更新需要的文件,如果出现有感叹号的文件,找到出现感叹号的文件. 2 选择感叹号文件,即冲突文件,单击鼠标右 ...
- JavaSE语法基础(3)---函数、数组
JavaSE语法基础(3)---函数.数组 函数的概念:实现特定功能的一段代码,可反复使用. 函数的出现减少代码冗余,提高代码的复用性,可读性,可维护性,可以使每个功能模块独立起来,方便分工合作. 函 ...
- js先后对某个js对象内的两个属性排序
需求 列表中先根据某id进行排序,然后id相同的再按某属性进行排序.最终显示效果如图所示: 实现代码 var data.items = [ {'brand_id':1,'farm_id':2}, {' ...
- Algorithm --> 求1到n的和
求1到n的和 输入n,求和1到n,要求不能使用乘除法,不使用任何if while for 以及三目运算,怎么做? 版本一 static int f(int n) { n && (n + ...