许多用于同步文件的工具不太适合同步您的主目录。因此,为了学习 Ruby,我一直在开发自己的同步工具。
我遇到的一个问题(我认为是在我的同步工具中)是当用户重命名文件或删除文件时发生的情况。想想第一种情况(如果用户重命名它)有没有一种方法可以让我知道这不是一个新文件而是一个已重命名的文件?也许是我不知道的文件的唯一 ID。文件描述符听起来像是需要研究的东西,但我很确定这是一个不同的概念。
答案1
无法确定文件是否已被重命名。
当一个文件被重命名时,它的索引节点号码不变。 (对于“外来”文件系统,例如网络文件系统,这可能并非如此,但对于所有“本机”Unix 文件系统来说,情况却如此。)但是,反之则不然:如果删除文件,则可能会创建一个新文件相同的索引节点号。因此,即使您看到一个文件与另一个文件之前具有相同的索引节点号,也不一定意味着该文件已被重命名。
索引节点号唯一标识文件当它存在时。这使得它适合检测硬链接,但不适用于检测重命名。
文件描述符与特定进程相关联,在这里没有用处。
您可以考虑一个启发式的方法:如果一个文件的大小、修改时间和索引节点号与以前相同,但名称不同,则意味着它已被重命名。这种启发式方法类似于许多同步工具检测未更改文件的方法:相同的名称、大小和修改时间。
我能想到的所有跟踪文件重命名的工具都是根据文件的内容来完成的。齐奏检测重命名的文件如果至少一个端点是远程的。一些现代版本控制系统(例如 git)也会检测重命名的文件。
答案2
文件描述符是在程序打开文件时创建的,并且仅在程序再次关闭文件之前有效。正如您所怀疑的那样:一个不同的概念。
如果文件刚刚重命名,索引节点不会改变,您可以使用它,但除非经常发生重命名,否则我怀疑它是否值得。