利用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 })
复制代码

 

posted @   闲云-野鹤  阅读(995)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示