![重命名或移动文件时 inode 是否会发生变化?](https://linux22.com/image/5998/%E9%87%8D%E5%91%BD%E5%90%8D%E6%88%96%E7%A7%BB%E5%8A%A8%E6%96%87%E4%BB%B6%E6%97%B6%20inode%20%E6%98%AF%E5%90%A6%E4%BC%9A%E5%8F%91%E7%94%9F%E5%8F%98%E5%8C%96%EF%BC%9F.png)
在 PHP 中,fileinode()
函数返回文件的 inode。我想知道是否可以用它来确定文件是否被重命名、移动或修改。
我做了一些测试,重命名后索引节点似乎保持不变。这种行为是否一致?它适用于任何 Linux 发行版上的任何类型的文件吗?
答案1
不跨文件系统边界的文件重命名只是元数据更改,因此它应该保留 inode 编号。一般来说,打开文件并修改其内容不应更改其索引节点号,无论如何,这仅在单个文件系统中有意义(但例如,它会更改访问时间)。请注意,某些工具(例如文本编辑器)往往会创建一个全新的文件而不是就地写入,并且那会导致使用新的索引节点。
如果您的目标是检查文件是否发生更改,那么检查访问时间和大小可能更可靠。
答案2
您不能使用 inode 来检查文件是否已更改。
当文件被重命名或移动时,它可能会也可能不会改变。它通常会保持不变,除非移动到另一个磁盘上......
答案3
PHP 文档很糟糕:含糊、模棱两可、具有误导性。
fileinode()
简单地定义为“获取文件 inode”或“返回 inode”。但如果你再深入一点,文档似乎开始说这个函数返回 inode数字。一个索引节点不仅仅是一个索引节点号。 “返回文件的inode”和“获取文件的inode”之间的区别数字一个文件”就像我签署我的房子的契约给你和我告诉你我的地址之间的区别。
dhag 和 robert 的回答非常好,所以我不会重复他们所说的内容或尝试改进它们。除了添加:检测文件是否已在文件系统中重命名或移动的最佳方法是查看st_ctime
inode 结构的成员。这是最后一次的时间(Unix 时间戳:日期和时间)C更改文件,包括其属性。根据文档,您可以在 PHP 中使用int filectime ( string $filename )
.