Javascript/Node.js - 检查文件是否已更改

问题描述 投票:0回答:2

我正在编写 Ace 编辑器,想要检查当前打开的文件是否已从其他用户/程序等更改了其内容,然后像您从 Geany 等其他编辑器中知道的那样弹出一个窗口。

检查文件是否更改的 Javascript 代码如下所示:

const fs = require("fs");

fs.watchFile("app/app.js" ,function() {
    console.log("File changed!");
});

如果我对 app.js 文件进行更改并保存它,它总是第一次工作并显示“文件已更改!”在日志中,但是当我进行其他更改并再次保存文件时,它有时不显示任何内容或仅显示巨大的时间延迟。我不知道发生了什么事。 你们有人知道要改变什么才能使它可靠吗?

javascript node.js ace-editor
2个回答
2
投票

使用不同的 Node API 可以解决效率低下的问题。

请注意 Node 官方文档中的以下免责声明

https://nodejs.org/docs/latest/api/fs.html#fs_fs_watchfile_filename_options_listener 使用 fs.watch() 比 fs.watchFile 和 fs.unwatchFile 更高效。尽可能使用 fs.watch 代替 fs.watchFile 和 fs.unwatchFile。

不要使用

fs.watchFile
,而是使用
fs.watch
,如下所示:

onst fs = require("fs");
fs.watch("app/app.js", function() {
    console.log("File changed!");
});

请注意,回调函数的参数不同:

https://nodejs.org/docs/latest/api/fs.html#fs_fs_watchfile_filename_options_listener 侦听器获取两个参数:当前 stat 对象和前一个 stat 对象:

https://nodejs.org/docs/latest/api/fs.html#fs_filename_argument 侦听器回调获取两个参数(事件类型、文件名)。 eventType 是“rename”或“change”,filename 是触发事件的文件的名称。 仅 Linux、macOS、Windows 和 AIX 支持在回调中提供文件名参数。即使在支持的平台上,也并不总是保证提供文件名。因此,不要假设回调中始终提供文件名参数,并且如果它为空,则有一些后备逻辑。

您似乎没有使用您的信息中的任何信息 上面的例子,但如果你这样做,请记下上面的内容。


0
投票

您正在观察单个文件(app/app.js)中的更改。将

watchFile
更改为
watch
以监视目录中任何文件的更改,并使用目录路径(“app”或“./app”)更改文件路径(“app/app.js”) ):

fs.watch("app", (event, filename) => {
  if (event === 'change' && filename) {
    console.log(filename + ' has been changed');
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.