在Node.js中,是否可以告诉被监视的文件被移动到哪里?

fs.watch只提供两种可能的事件types: 'rename''change' 。 重命名文件(例如使用mv )和删除它(例如使用rm )都会导致fs.watch报告'rename'事件。

移动文件后, fs.watch将继续报告事件(除非您明确closuresFSWatcher )。 发生这种情况时,我想知道文件已移到哪里。

有没有办法做到这一点,而不是触摸系统上的每个文件,看看什么时候发生'change'事件?

这看起来是不可能的,直到节点实现一个接口来从文件描述符中获取文件名(所以你可以保留一个fd并从那里得到rename的名字),或者沿着FSWatcher事件可靠地返回path/文件名。

解决这个问题的方法是通过fs.link创build一个到目标文件的临时硬链接,然后即使修改之后你也可以在文件中find它,尽pipe你不能检索它的新名字。

有趣的是EventMachine也有相同的问题: http ://eventmachine.rubyforge.org/EventMachine/FileWatch.html#M000291

我想你将不得不查看文件的原始状态,并查看文件的标识符inode 。 如果文件没有从一个分区/文件系统/驱动器移动到另一个(实际上它必须是复制 – 然后 – 删除 – 原始操作),那么inode将是相同的。

不幸的是,通常没有索引inode的查找表来获得他们的新名称/位置。 你将不得不系统地search整个系统,假设你可以先看看可能的地方,这可能不是那么糟糕。 或者只能search有限的区域。

你可以使用临时硬链接(里卡多的想法)来检测它是否被删除,而不是移动。 当您创build硬链接时,链接计数器的数量将从1变为2,并且在您的临时硬链接的对应部分被删除时,将从2变回1。 如果被删除,则不需要查找文件的目的地。

如果在这个领域只有几千个文件,那么这里的解决scheme应该工作的很好,如果有更多的,取决于你的系统,它可能工作,但可能会有延迟。

如果你想减less延迟,你可以有一个你已经知道inode的文件的SQL数据库。 例如, /folder/filea/folder/fileb都存在不同的inode s。 当fileb移动到filec ,您不需要fileb filea查找inode因为您之前已经查看过。 这个逻辑应该大大减less必要的stat命令的数量。 但是,如果删除了filea ,并将fileb移动到文件的位置,这种显着的减less方法将找不到任何结果,在这种情况下,您将不得不退回到search整个工作目录。

您仍然可以select确保/etc/dev /etc操作系统文件夹。 只是作为最后的手段。 假设您可以使用临时硬链接来检测删除,那么您可能永远不必search。

你的工作区有多大? 您是否确定该文件是否总是在某个工作文件夹内从一个地方移动到另一个地方? 有关您的问题环境的其他详细信息将有所帮助