Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用boost::filesystem获取inode?_C++_Boost - Fatal编程技术网

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

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:

我想检测我是否已经看到了一个文件,并想用一些独特的东西来标识它。在Linux下,inode编号与设备id一起存在(请参见
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不同的时间”!=“相同的文件”和“不同的索引节点不同的时间”!=“不同的文件”。你是对的。在一次扫描中,这不是一个问题,你只需要了解“其他”硬链接(除了比赛条件)。但你正确地指出,你不能再依赖他们了。