【发布时间】:2022-05-04 15:13:17
【问题描述】:
我正在编写一个 node.js 程序,该程序需要在特定目录中创建具有特定名称的文件后立即执行某些操作。我可以通过重复调用 fs.readdir 来做到这一点,直到我看到文件的名称,但我宁愿做一些更有效的事情。有谁知道这样做的方法吗?
【问题讨论】:
标签: javascript node.js file-io fs
我正在编写一个 node.js 程序,该程序需要在特定目录中创建具有特定名称的文件后立即执行某些操作。我可以通过重复调用 fs.readdir 来做到这一点,直到我看到文件的名称,但我宁愿做一些更有效的事情。有谁知道这样做的方法吗?
【问题讨论】:
标签: javascript node.js file-io fs
查看fs.watch(和 fs.watchFile 作为后备)实现,但意识到它并不完美:
http://nodejs.org/api/fs.html#fs_fs_watch_filename_options_listener
注意事项#
fs.watch API 并非 100% 跨平台一致,而是 在某些情况下不可用。可用性#
此功能取决于提供 通知文件系统更改的方式。
On Linux systems, this uses inotify. On BSD systems (including OS X), this uses kqueue. On SunOS systems (including Solaris and SmartOS), this uses event ports. On Windows systems, this feature depends on ReadDirectoryChangesW.如果底层功能由于某种原因不可用,那么 fs.watch 将无法运行。例如,观看文件或 网络文件系统(NFS、SMB 等)上的目录通常不会 可靠地工作或根本工作。
你仍然可以使用 fs.watchFile,它使用 stat 轮询,但它是 速度较慢,可靠性较差。
【讨论】:
fs.watchFile 或者只是在计时器上调用fs.stat,就像它在幕后所做的那样。是的,当文件不存在时,您可能会收到一个错误,您必须评估并确定它是否是一个错误。
您基本上可以自己使用fs.watchFile 或fs.watch 或使用节点模块为您完成,我强烈建议使用节点模块.. 对于非错误的跨平台和快速解决方案,它可能棘手。我建议使用chokidar 或have a look at other modules 这样做。
使用 chokidar,您可以这样做:
var chokidar = require('chokidar');
var watcher = chokidar.watch('YourDirecrtory');
watcher.on('add', function(path) {console.log('File', path, 'has been added');});
那么您就不必关心边缘情况或跨平台支持。
【讨论】: