【发布时间】:2013-04-10 19:08:08
【问题描述】:
我在 Linux 上有一个文件索引数据库。目前我使用文件路径作为标识符。 但是如果一个文件被移动/重命名,它的路径就会改变,我无法将我的数据库记录与新文件匹配,并且必须删除/重新创建记录。更糟糕的是,如果一个目录被移动/重命名,那么我必须删除/重新创建所有文件和嵌套目录的记录。
我想使用 inode 编号作为唯一的文件标识符,但如果删除文件并创建另一个文件,则可以重复使用 inode 编号。
所以,我想知道我是否可以使用一对{inode,crtime} 作为唯一的文件标识符。
我希望在 ext4 上使用 i_crtime,在 NTFS 上使用 creation_time。
在我有限的测试(使用 ext4)中,inode 和 crtime 在同一文件系统中重命名或移动文件或目录时确实保持不变。
所以,问题是是否存在文件的 inode 或 crtime 可能发生变化的情况。 例如,fsck 或碎片整理或分区调整大小是否可以更改 inode 或 crtime 或文件?
有趣的是 http://msdn.microsoft.com/en-us/library/aa363788%28VS.85%29.aspx 说:
- "在 NTFS 文件系统中,一个文件在被删除之前保持相同的文件 ID。"
还有: - “在某些情况下,文件的文件 ID 会随着时间而改变。”
那么,他们提到的那些案例是什么?
请注意,我研究过类似的问题:
- How to determine the uniqueness of a file in linux?
- Executing 'mv A B': Will the 'inode' be changed?
- Best approach to detecting a move or rename to a file in Linux?
但他们没有回答我的问题。
【问题讨论】:
-
{device_nr, inode_nr} 是系统上文件(“inode”)的唯一 ID。这些保证是稳定的(也许,但 NFS 除外)移动文件不会更改 inode,它只是将指向 inode 的链接移动到另一个目录。 跨文件系统移动是不同的。顺便说一句:微软文档提到 NTFS 作为规则的一个可能的例外(就像我的 NFS 例外,可能还有 NAS/SAN 存储?)
-
顺便说一句:什么是 crtime? UFS 只有 {ctime,atime,mtime}
-
crtime 是文件创建时间。它是在 ext4 中添加的。其他帖子中对此进行了详细讨论。
-
对于 Linux,因为 inode 可以在 NFS 中重复使用,并且因为您可能在 NFS 上索引文件,所以您不能只使用 INODE(我们同意这一点)。因此,对于 Linux,我将使用 inode 和 inode 生成作为唯一键。让我们知道您采用了什么解决方案(这个问题没有答案)。