如何使用 boost::filesystem 获取 inode?

Bor*_*rph 3 c++ boost

我想检测我是否已经看到了一个文件,并且想用一些独特的东西来识别它。在 Linux 下,有 inode 编号和设备 ID(请参阅stat()fstat())。我想在 Windows 下我会找到类似的东西。

为了简单起见,它boost::filesystem提供了方便的方法,例如我可以用来boost::filesystem::recursive_directory_iterator遍历目录树。它file_status告诉我它是否是一个常规文件,但不是 inode 号。

我发现的最接近的事情是boost::filesystem::equivalent()走两条路。我想这也是最便携的设计。

问题是我想将索引节点号放入数据库中以便快速查找。我无法使用此函数执行此操作,我必须调用equivalent()数据库中已存在的所有路径。

我是否运气不好,由于可移植性原因,Boost 不会向我提供此类信息?

(编辑)目的是在文件夹树的一次扫描期间通过硬链接检测重复项。equivalent()正是这样做的,但我必须做一个二次算法。

Ben*_*Ben 5

Windows CRT 实现stat始终使用零作为 inode,因此您必须自行设计。这是因为在 Windows 上FindFirstfile比 更快GetFileInformationByHandle,因此stat使用FindFirstFile,其中不包括 inode 信息。如果您不需要索引节点,那就太好了,性能获胜。但如果您这样做,以下内容将会有所帮助。

与 INODE 等效的 NTFS 是 MFT 记录号,也称为文件 ID。它的属性略有不同,但在误差范围内可以用于与 INODE 相同的目的,即识别两个路径是否指向同一个文件。

您可以使用GetFileInformationByHandleGetFileInformationByHandleEx检索此信息。您首先必须调用CreateFile以获取文件句柄。

  • FILE_READ_ATTRIBUTES仅需要获取文件 ID 的权限。
  • 您应该指定FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE
  • 您应该指定OPEN_EXISTING为处置。

获得句柄后,请使用 GetFileInformation 函数之一获取文件 ID,然后关闭句柄。

您需要的此信息可在BY_HANDLE_FILE_INFORMATION nFileIndexLownFileIndexHigh成员中找到,或者如果正在使用 ReFS,则可能正在使用 128 位文件 ID。要获得此功能,您必须使用更新的功能。