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

时间:2014-05-08 11:53:26

标签: c++ boost

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

为了方便起见,boost::filesystem提供了方便的方法,例如我可以使用boost::filesystem::recursive_directory_iterator遍历目录树。如果它是常规文件,file_status给我,而不是inode编号。

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

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

由于便携性原因,我是否运气不好并且不会向我提供此类信息?

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

1 个答案:

答案 0 :(得分:4)

stat的Windows CRT实现始终对inode使用零,因此您必须自己滚动。这是因为在Windows上FindFirstfileGetFileInformationByHandle快,因此stat使用FindFirstFile,其中不包含inode信息。如果你不需要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。要获得此功能,您必须使用更新的功能。