我在 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 的唯一标识符
- 将文件移动到不同的目录不会改变其 inode_nr
- linux
inotify
接口(interface)使您能够监控 inode(文件或目录)的更改
补充说明:
- 跨文件系统移动文件的处理方式不同。 (实际上是复制+删除)
- 网络文件系统(或安装的 NTFS)不能始终保证 inodenumbers 的稳定性
- Microsoft 不是 unix 供应商,它的文档不涵盖 Unix 或其文件系统,应该被忽略(除了 NTFS 的内部结构)
额外的文字:旧的 Unix 格言“一切都是文件”实际上应该是:“一切都是 inode”。 inode 包含有关文件(或目录,或特殊文件)的所有元信息, 名称除外。文件名实际上只是碰巧链接到特定 inode 的目录条目。移动一个文件意味着:创建一个指向同一个 inode 的新链接,最后删除链接到它的旧目录条目。
inode元数据可以通过stat()
和fstat()
,以及lstat()
系统调用获取。
关于linux - inode 和 crtime 可以作为唯一的文件标识吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16069898/