在目录上使用 fs.watch 似乎不会注意到添加的文件

Posted

技术标签:

【中文标题】在目录上使用 fs.watch 似乎不会注意到添加的文件【英文标题】:Using fs.watch on a directory does not seem to notice added files 【发布时间】:2020-03-04 07:55:18 【问题描述】:

当我在目录上使用 fs.watch 时: https://nodejs.org/docs/latest/api/fs.html#fs_fs_watch_filename_options_listener

在调用 fs.watch 后,它不会注意到添加到目录中的新文件。我在 Linux 上 - 我需要进行一些调用以通知新添加/删除的文件吗?

返回对象 FSWatcher 上的唯一事件是“更改”、“错误”和“关闭” - 文件有“添加”或“删除”。

interface FSWatcher extends events.EventEmitter 
    close(): void;

    /**
     * events.EventEmitter
     *   1. change
     *   2. error
     */
    addListener(event: string, listener: (...args: any[]) => void): this;
    addListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this;
    addListener(event: "error", listener: (error: Error) => void): this;
    addListener(event: "close", listener: () => void): this;

    on(event: string, listener: (...args: any[]) => void): this;
    on(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this;
    on(event: "error", listener: (error: Error) => void): this;
    on(event: "close", listener: () => void): this;

    once(event: string, listener: (...args: any[]) => void): this;
    once(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this;
    once(event: "error", listener: (error: Error) => void): this;
    once(event: "close", listener: () => void): this;

    prependListener(event: string, listener: (...args: any[]) => void): this;
    prependListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this;
    prependListener(event: "error", listener: (error: Error) => void): this;
    prependListener(event: "close", listener: () => void): this;

    prependOnceListener(event: string, listener: (...args: any[]) => void): this;
    prependOnceListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this;
    prependOnceListener(event: "error", listener: (error: Error) => void): this;
    prependOnceListener(event: "close", listener: () => void): this;

【问题讨论】:

【参考方案1】:

没关系 - fs.watch 确实会看到删除/添加/创建/取消链接的文件。我的错误只是将文件路径传递给 fs.watch 而不是传递目录。最好只传递目录。要在 Linux 上完成类似于 fs.watch 的操作,您可以使用:

 inotifywait -m /path/one -m /path/two -m /path/three -e create \
           -e moved_to -e modify -e moved_from \
           -e move -e create -e delete -e delete_self

【讨论】:

以上是关于在目录上使用 fs.watch 似乎不会注意到添加的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭文件夹的 fs.watch 监听器

量角器:如何确认 fs.watch 被调用

fs.watch 爬坑

当我更改观看的文件时,fs.watch 触发了两次

当我更改监视文件时,fs.watch会两次触发

创建目录似乎有一点延迟