重命名或移动文件时 inode 是否会发生变化?

重命名或移动文件时 inode 是否会发生变化?

在 PHP 中,fileinode()函数返回文件的 inode。我想知道是否可以用它来确定文件是否被重命名、移动或修改。

我做了一些测试,重命名后索引节点似乎保持不变。这种行为是否一致?它适用于任何 Linux 发行版上的任何类型的文件吗?

答案1

不跨文件系统边界的文件重命名只是元数据更改,因此它应该保留 inode 编号。一般来说,打开文件并修改其内容不应更改其索引节点号,无论如何,这仅在单个文件系统中有意义(但例如,它会更改访问时间)。请注意,某些工具(例如文本编辑器)往往会创建一个全新的文件而不是就地写入,并且会导致使用新的索引节点。

如果您的目标是检查文件是否发生更改,那么检查访问时间和大小可能更可靠。

答案2

您不能使用 inode 来检查文件是否已更改。

当文件被重命名或移动时,它可能会也可能不会改变。它通常会保持不变,除非移动到另一个磁盘上......

答案3

PHP 文档糟糕:含糊、模棱两可、具有误导性。  fileinode()简单地定义为“获取文件 inode”或“返回 inode”。但如果你再深入一点,文档似乎开始说这个函数返回 inode数字。一个索引节点不仅仅是一个索引节点号。 “返回文件的inode”和“获取文件的inode”之间的区别数字一个文件”就像我签署我的房子的契约给你和我告诉你我的地址之间的区别。

dhag 和 robert 的回答非常好,所以我不会重复他们所说的内容或尝试改进它们。除了添加:检测文件是否已在文件系统中重命名或移动的最佳方法是查看st_ctimeinode 结构的成员。这是最后一次的时间(Unix 时间戳:日期和时间)C更改文件,包括其属性。根据文档,您可以在 PHP 中使用int filectime ( string $filename ).

相关内容