【发布时间】:2014-05-09 03:59:24
【问题描述】:
我想检测我是否已经看到了一个文件,并想用一些独特的东西来识别它。在 Linux 下,inode 编号与设备 ID 一起出现(请参阅 stat() 或 fstat())。我假设在 Windows 下我会找到类似的东西。
为了简单起见,boost::filesystem 提供了方便的方法,例如我可以使用boost::filesystem::recursive_directory_iterator 来遍历目录树。 file_status 告诉我它是否是常规文件,但不是 inode 编号。
我发现最接近的是boost::filesystem::equivalent() 采用两条路径。我想这也是最便携的设计。
问题是我想将 inode 编号放入数据库中以便快速查找。我无法使用此函数执行此操作,我必须调用 equivalent() 并使用数据库中已存在的所有路径。
我是不是运气不好,由于便携性原因,boost 不会向我提供此类信息?
(编辑)目的是在一次扫描文件夹树期间通过硬链接检测重复项。 equivalent() 正是这样做的,但我必须做一个二次算法。
【问题讨论】:
-
对于您的用例,您还应该知道如果文件被删除,inode 可以重新使用。 Linux/unix inode 和 Windows 文件 ID/MFT 记录都是如此。因此,如果您今天看到的 inode 与您昨天看到的 inode 相同,那没有任何意义。仅当您知道 both 文件现在 存在时,inode 才有用。此外,如果删除了一个文件,并创建了一个具有相同名称的相同文件,则 inode 可能会有所不同。这是“更新”文件的常见范例。所以“相同的inode不同的时间”!=“相同的文件”和“不同的inode不同的时间”!=“不同的文件”。
-
你是对的。在一次扫描期间,这不是问题,您只需了解“其他”硬链接(除了竞争条件)。但你指出,除此之外你不能依赖它们。