前言

开发云盘的时候,使用到了依赖于 node.js 的 chokidar 做本地文件监听,获取文件修改的触发事件。下面来给大家介绍一下涉及的知识点以及实现过程。


知识点

chokidar.watch(paths, [options]) 返回一个chokidar构造监听实例
参数:paths
一个字符串或者是一个数组,描述监听的文件或者文件夹的路径。


事件响应

.add 新增文件时触发

.addDir 新增文件夹的时候触发

.unlink 对应的文件的删除

.unlinkDir 对应的文件夹的删除

.change 文件内容改变时触发

.all(除了ready, raw, and error之外所有的事件类型)包含:add、addDir、unlink、unlinkDir、change

.ready 初始化完成

.raw 原始事件

.error 捕获error

.unwatch(path / paths) 停止监听传入文件/文件夹

.close() 从监视文件中移除/关闭所有侦听器

.getWatched() 返回此FSWatcher实例正在监视的文件系统上所有路径的对象


监听文件样例代码

import chokidar from "chokidar";
import { ipcRenderer } from "electron";
import fs from "fs";
let watcher: any = null;
export const addFileToWatcher = (localPath: string) => {
if (watcher) {
watcher.add(localPath);
} else {
watcher = chokidar.watch(localPath);
watcher.on("all", (event: any, path: string) => {
//监听除了ready, raw, and error之外所有的事件类型
console.log(event, path);
});
watcher.on("ready", (path: string) => {
console.log("ready", path);
});
watcher.on("add", (path: string) => {
console.log("增加监听", path);
console.log(watcher.getWatched());
});
watcher.on("change", (path: string) => {
const token = localStorage.getItem("token");
console.log("监听+文件更新:" + path);
ipcRenderer.send("fileChange", path.replaceAll("\\", "/"), token);
});
watcher.on("unlink", (path: string) => {
watcher.unwatch(path);
if (fs.existsSync(path)) {
watcher.add(path);
const token = localStorage.getItem("token");
console.log("文件保存:" + path);
ipcRenderer.send("fileChange", path.replaceAll("\\", "/"), token);
}
});
}
};

export const removeFileWathcer = (localPath: string) => {
console.log('watcher',watcher)
if (watcher) {
console.log("移除监听-", localPath);
watcher.unwatch(localPath);
}
};

注意事项

实现文件监听时,出现了系统兼容性的问题,有的电脑会出现文件修改不触发change,而是触发了 unlink 事件的情况。因此,在 unlink 事件里做了补充,当文件存在时触发更新。


以上就是本期关于  chokidar 模块实现本地文件监听的分享,希望能给大家带来帮助。


下期给大家分享更多实战中的点滴,如果大家对此感兴趣,欢迎各位关注、留言,大家的支持就是我的动力!