linux - inode 和 crtime 可以作为唯一的文件标识吗?

标签 linux inode

我在 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 会随时间而改变。

那么,他们提到的那些案例是什么?

请注意,我研究过类似的问题:

但他们没有回答我的问题。

最佳答案

  • {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/

相关文章:

linux - 如何通过 linux 命令提示符设置 PHP session 变量?

php - linux上根据ext4的inode号随机100个空文件

c - Unix readdir (3) 和 stat (2) 给出不同的 inode

屏幕输出中空行的linux Makefile语法

java - Zip - 添加较新的文件和文件夹,删除旧的文件和文件夹

linux - 如何加速 Linux 内核编译?

python - 特定python进程的看门狗

linux - 将磁盘上的 inode 读取到内存中

linux - 通过inode恢复文件

linux - centeron 插件忽略正则表达式