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

于是就找到了nodejs 的chokidar模块。 然后利用redis的set集合。因为我们频繁更改。如果用普通的字符 会增加比较。set是一个集合,里面的元素都是不重复的。正好可以利用这个特性。帮我们记录更改的记录文件。删除的时候,然后删掉set中的文件。目前只做了增加或修改的文件提交,如果本地删除的 不会同步到服务器。

监听本地文件的代码如下

  1. const chokidar = require('chokidar')
  2. const redis = require("redis"),
  3. client = redis.createClient();
  4.  
  5. let watcher = null
  6. let ready = false
  7. const key = "modifyFiles";
  8. let watch = function (filepath) {
  9. // 文件新增时
  10. function addFileListener(path_) {
  11. if (ready) {
  12. client.sadd(key,path_);
  13. console.log('文件', path_, 'has been added')
  14. }
  15. }
  16. function addDirecotryListener(path_) {
  17. if (ready) {
  18. console.log('目录', path_, 'has been added')
  19. }
  20. }
  21.  
  22. // 文件内容改变时
  23. function fileChangeListener(path_) {
  24. client.sadd(key,path_);
  25. console.log('文件', path_, '已经修改')
  26. }
  27.  
  28. // 删除文件
  29. function fileRemovedListener(path_) {
  30. client.srem(key,path_)
  31. console.log('文件', path_, '被删除了')
  32. }
  33.  
  34. // 删除目录时
  35. function directoryRemovedListener(path_) {
  36. console.info('目录', path_, '被删除了')
  37. }
  38.  
  39. if (!watcher) {
  40. watcher = chokidar.watch(filepath)
  41. }
  42. watcher
  43. .on('add', addFileListener)
  44. .on('addDir', addDirecotryListener)
  45. .on('change', fileChangeListener)
  46. .on('unlink', fileRemovedListener)
  47. .on('unlinkDir', directoryRemovedListener)
  48. .on('error', function (error) {
  49. console.info('发生了错误:', error);
  50. })
  51. .on('ready', function () {
  52. console.info('准备监听');
  53. ready = true
  54. })
  55. }
  56. 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. })

利用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. Kruskal重构树(货车运输)

    ... 和Kruskal生成树一样 本来是u,v连一条f的边 现在变成新建一个点,点权为f,u v都像它连无边权的边 (实际上应该是u的根和v的根) 这样树有一些性质: 1.二叉树 2.原树与新树两点 ...

  2. struct 2 基本知识

    (最近在写一个ssh的项目,虽然看网上好像都说ssh已经过气了...之前虽然老师有上过这个课,我还做了一个PPT专门讲这个来着,但果然没有实践经验还是不容易理解.在参照一个项目写ssh时候,表示四脸蒙 ...

  3. prompt 方法显示输入对话框

    prompt 方法显示输入对话框 原理: prompt() 方法用于与用户交互,提示用户输入信息的对话框. prompt(str1,str2);此方法包含两个属性: str1:用于提示用户输入的信息. ...

  4. 自创最精简的python装饰器

    个人心血原创,欢迎转载,请注明作者和出处.否则依法追究法律责任!!!! author:headsen  chen date:2018-03-21  10:37:52 代码: 代码解析过程:1,def ...

  5. SoupUI安装

    (仅供学习,严禁用于商业应用) 今天开始在公司需要做websocket接口测试,以前从来没有接触过,对美好生活充满了向往啊,今天从安装开始吧! 至于什么是websocket自行百度,我也是百度出来的, ...

  6. NMEA0183

    NMEA简介 NMEA是全国海洋电子协会(National Marine Electronics Association):国际海上电子协会(National Marine Electronics A ...

  7. svn版本提交冲突问题解决详解

    svn冲突文件解决方法   工具/原料   svn客户端 方法/步骤   1 通过SVN客户端更新需要的文件,如果出现有感叹号的文件,找到出现感叹号的文件. 2 选择感叹号文件,即冲突文件,单击鼠标右 ...

  8. JavaSE语法基础(3)---函数、数组

    JavaSE语法基础(3)---函数.数组 函数的概念:实现特定功能的一段代码,可反复使用. 函数的出现减少代码冗余,提高代码的复用性,可读性,可维护性,可以使每个功能模块独立起来,方便分工合作. 函 ...

  9. js先后对某个js对象内的两个属性排序

    需求 列表中先根据某id进行排序,然后id相同的再按某属性进行排序.最终显示效果如图所示: 实现代码 var data.items = [ {'brand_id':1,'farm_id':2}, {' ...

  10. Algorithm --> 求1到n的和

    求1到n的和 输入n,求和1到n,要求不能使用乘除法,不使用任何if while for 以及三目运算,怎么做? 版本一 static int f(int n) { n && (n + ...