在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?