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

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

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

有没有办法做到这一点,而不是触摸系统上的每个文件轮流查看'change'事件何时被触发?


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

解决这个问题的方法是通过fs.link创建一个到目标文件的临时硬链接,然后即使修改后也可以访问该文件,尽管你无法检索它的新名称。

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


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

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

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

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

如果你想减少延迟,你可以有一个你已经知道inode的文件的SQL数据库。 例如, /folder/filea/folder/fileb两者都存在不同的/folder/fileb inode 。 当fileb移动到filec ,你没有必要stat filea寻找inode ,因为你已经看到它之前。 这个逻辑应该大大减少必要的stat命令的数量。 但是,如果filea被删除, fileb移入filea之地位,这一戏剧性的还原法会发现没有结果,在这种情况下,你将不得不回落到搜索整个工作目录。

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

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

链接地址: http://www.djcxy.com/p/10005.html

上一篇: In Node.js, is it possible to tell where a watched file was moved to?

下一篇: Class vs ID with nested CSS