利用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传输到指定的文件。代码如下

 1 var path, fs, redis, client, node_ssh, ssh
 2 node_ssh = require(‘node-ssh‘)
 3 ssh = new node_ssh()
 4 fs = require(‘fs‘)
 5 path = require(‘path‘)
 6 redis = require("redis")
 7 client = redis.createClient()
 8
 9 //redis 集合key
10 const key = "modifyFiles";
11
12 //远程目录
13 const remote_path = "/home/wwwroot/www.ccc.com/";
14
15 //本地目录
16 const local_path = "E:/work/www.ccc.com/"
17
18 let uploadFiles = [{
19   "local": "",
20   "remote": ""
21 }];
22
23 //远程server信息
24 const serverConfig = {
25   host: ‘x.x.x.x‘,
26   username: ‘admin‘,
27   password: ‘admin‘,
28   port: 22
29 }
30 //读取redis中的set
31 client.smembers(key,  (error, data)=> {
32   if (error == true) {
33     return
34   }
35
36   //链接ssh
37   ssh.connect(serverConfig)
38   .then(() => {
39
40     if(data.length == 0) {
41       return
42     }
43
44     // 组装数据
45     data.map(function(item, index){
46       let path = item.replace(/\\/g, "/");
47       let temp = {
48         local: path,
49         remote: path.replace(local_path, remote_path)
50       }
51       uploadFiles[index] = temp;
52     })
53
54     //上传文件
55     ssh.putFiles(uploadFiles).then(function () {
56         console.log("文档上传成功了!!!!")
57         client.srem(key,data)
58       }, function (error) {
59         console.log(error)
60       })
61
62     })
63
64 })

原文地址:https://www.cnblogs.com/tl542475736/p/8718335.html

时间: 2024-07-31 11:19:28

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

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

要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上找对应ContentProvider的源码:https://github.com/android 有好多个,哪一个才是短信数据的ContentProvider呢? 在filters输入框:输入telephony. 现在只有一个了,打开: 装有git的话,可以选择clone到本地,没有的话,就选择下载

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

一:在linux环境下安装部署好mysql 开启binlog Vim  /etc/my.cnf mysql的binlog格式有3种,为了把binlog解析成json数据格式,要设置binlog的格式为row(binlog有三种格式:Statement.Row以及Mixed) 3重启msyql服务 service mysqld restart 查看是否已经开启binlog 查看是否已经开启binlog 是否改为row模式 /var/lib/mysql下看到生成了相应的binlog监听日志文件,如图

页面监听状态改变网站Title

长期以来我们一直缺少一个判断用户是否正在浏览某个指定标签页的方法.用户是否去看别的网站了?他们切换回来了么? 现在,HTML5里页面可见性接口就提供给了程序员一个方法,让他们使用visibilitychange页面事件来判断当前页面可见性的状态,并针对性的执行某些任务.同时还有新的document.hidden属性可以使用. document.hidden 这个新出现的document.hidden属性,它显示页面是否为用户当前观看的页面,值为ture或false. document.visib

【Android】利用Activity生命周期监听应用前后台切换

~转载请注明:http://blog.csdn.net/u013015161/article/details/46762991 实现介绍 在Android应用开发中,我们有时候需要监听到应用前后台的切换.这里提供一种思路,该思路并非原创,而是一种比较通用的办法,这里做一下介绍,附带实际过程中遇到的问题的解决. 具体实现思路是通过重写Activity的onResume方法和onStop方法实现,即在onStop里判断应用是否切换到后台,在onResume里判断是否切换到前台. 先回顾一下Activ

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

c#原始提供了http的监听的类HttpListener,实现了简单的http.文章地址<C# 控制台或者winform程序开启http的监听状态> 但是经过我测试,这个HttpListener提供的真的就只是简单的http监听功能,无法实现高并发处理. 不知道是我处理问题还是其他什么原因,无法实现,当上一个http请求连接尚未关闭的情况下,即便是把请求放到另外一个线程执行,都要等到处理结束,close了才能接受和处理下一次的连接请求. 也许你会说HttpListener不是提供了异步监听的嘛

ArcEngine GroupLayer监听图层改变

最近项目中需要用到在TOC监听图层的变化,从而针对添加的不同图层进行不同的操作.但是当TOC中添加图层组时,无法监听到图层组中添加图层的动作.也就无法获取到向图层组中添加的图层. 在开发手册中也没有找到相应的事件接口来实现.于是就动手自己写了一个事件监听. 实现的思路是,自己构建事件接口,然后构建一个GroupLayer的子类来实现这个接口. 具体看代码: /////////////////////////////// /////// 事件接口的代码 // 构建图层组图层增加的委托 public

监听窗口大小改变,同时根据窗口大小修改某个元素的大小

jQuery的方法: <script> $(window).resize(function(){ var width = $(this).width(); var height = $(this).height(); alert('width'+width+'-height'+height); }); </script> 以上的方法,不能写在页面加载完成事件函数$(function(){})内部,而需要写在外面. 页面加载完成事件: $(function(){}); $(docum

groovy修改代码不用重启通过监听记录改变时间重新加载

groovy是一个跟java 很像的脚本语言,基于jvm,写法比java随意一点可以跟java代码很好的集合,如果项目中有用到规则可以在控制层使用groovy编写代码,调用规则. 在spring-mvc的配置文件中配置下面的

利用原生JS实时监听input框输入值

传送门https://www.cnblogs.com/lantinggumo/p/7636715.html 传送门https://www.cnblogs.com/nailc/p/8572226.html 原文地址:https://www.cnblogs.com/wzh1997/p/11135589.html