【问题标题】:node.js monitoring for when a file is creatednode.js 监控何时创建文件
【发布时间】:2022-05-04 15:13:17
【问题描述】:

我正在编写一个 node.js 程序,该程序需要在特定目录中创建具有特定名称的文件后立即执行某些操作。我可以通过重复调用 fs.readdir 来做到这一点,直到我看到文件的名称,但我宁愿做一些更有效的事情。有谁知道这样做的方法吗?

【问题讨论】:

    标签: javascript node.js file-io fs


    【解决方案1】:

    查看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 轮询,但它是 速度较慢,可靠性较差。

    【讨论】:

    • 使用此函数会引发 errno 异常。我不是在等待更改文件,而是在等待
    • 如果它是一个文件,我会使用fs.watchFile 或者只是在计时器上调用fs.stat,就像它在幕后所做的那样。是的,当文件不存在时,您可能会收到一个错误,您必须评估并确定它是否是一个错误。
    【解决方案2】:

    您基本上可以自己使用fs.watchFilefs.watch 或使用节点模块为您完成,我强烈建议使用节点模块.. 对于非错误的跨平台和快速解决方案,它可能棘手。我建议使用chokidarhave 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');});
    

    那么您就不必关心边缘情况或跨平台支持。

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多