C++ 如何使用boost::filesystem获取inode?
我想检测我是否已经看到了一个文件,并想用一些独特的东西来标识它。在Linux下,inode编号与设备id一起存在(请参见C++ 如何使用boost::filesystem获取inode?,c++,boost,C++,Boost,我想检测我是否已经看到了一个文件,并想用一些独特的东西来标识它。在Linux下,inode编号与设备id一起存在(请参见stat()或fstat())。我想在Windows下我会发现类似的东西 简单地说,boost::filesystem提供了方便的方法,例如,我可以使用boost::filesystem::recursive\u directory\u迭代器来遍历目录树。file\u status会显示它是否为常规文件,但不会显示inode编号 我找到的最接近的东西是采用两条路径的boost:
stat()
或fstat()
)。我想在Windows下我会发现类似的东西
简单地说,boost::filesystem
提供了方便的方法,例如,我可以使用boost::filesystem::recursive\u directory\u迭代器来遍历目录树。file\u status
会显示它是否为常规文件,但不会显示inode编号
我找到的最接近的东西是采用两条路径的boost::filesystem::equivalent()。我想这也是最便携的设计
问题是,我想把inode编号放入数据库,以便快速查找。我无法使用此函数执行此操作,我必须使用数据库中已经存在的所有路径调用equired()
我是不是运气不好,boost由于可移植性原因不会向我提供此类信息
(编辑)目的是在一次扫描文件夹树期间通过硬链接检测重复项equivalent()
就是这样做的,但是我必须做一个二次算法。stat
的Windows CRT实现总是对inode使用零,所以您必须自己滚动。这是因为在Windows上,FindFirstfile
比GetFileInformationByHandle
更快,因此stat
使用FindFirstfile
,其中不包括inode信息。如果你不需要inode,那太好了,性能赢了。但如果你这样做了,以下几点会有所帮助
与INODE等效的NTFS是MFT记录号,也称为文件ID。它的属性稍有不同,但在一定的误差范围内可以用于与INODE相同的目的,即标识两条路径是否指向同一文件
您可以使用或检索此信息。您必须首先调用CreateFile
来获取文件句柄
- 您只需要
FILE\u READ\u ATTRIBUTES
权限即可获取文件ID
- 您应该指定
文件共享|读取|文件共享|写入|文件共享|删除
- 您应该指定
OPEN\u EXISTING
作为处置
获得句柄后,使用其中一个GetFileInformation函数获取文件ID,然后关闭句柄
您需要的信息可在BY\u HANDLE\u文件\u信息
nFileIndexLow
和nFileIndexHigh
成员中找到,或者如果正在使用ReFS,则可能正在使用128位的文件ID。要获得这一点,您必须使用更新的函数。从严格意义上说,这是一个信息性的注释,因为它根本没有回答以下问题:“如何使用boost::filesystem获取inode?”@sehe,实际上他的问题不是“如何使用boost实现这一点”而是“我正在使用boost获取inode,但它在Windows上不起作用-我如何才能使它在Windows上起作用。我能用boost做吗?如果不能,那怎么做?。这是很有价值的信息,谢谢!sehe是对的,它没有直接回答这个问题,但是“我能用boost做吗?如果不能,那怎么做?”?“一针见血。对于您的用例,您还应该知道,如果删除文件,inode可以重复使用。Linux/unix索引节点和Windows文件ID/MFT记录都是这样。所以,如果你今天看到的inode与你昨天看到的inode相同,那意味着什么都没有。inode只有在您知道这两个文件现在都存在时才有用。此外,如果删除了一个文件,并且使用相同的名称创建了一个相同的文件,inode可能会不同。这是“更新”文件的常见范例。所以“同一个inode不同的时间”!=“相同的文件”和“不同的索引节点不同的时间”!=“不同的文件”。你是对的。在一次扫描中,这不是一个问题,你只需要了解“其他”硬链接(除了比赛条件)。但你正确地指出,你不能再依赖他们了。