【发布时间】:2015-07-01 16:54:54
【问题描述】:
如何在 Windows 中找到指向文件/文件夹的所有硬链接和符号链接(使用标准操作系统功能)?
什么是反对 UNIX 的?
【问题讨论】:
标签: c++ winapi filesystems symlink hardlink
如何在 Windows 中找到指向文件/文件夹的所有硬链接和符号链接(使用标准操作系统功能)?
什么是反对 UNIX 的?
【问题讨论】:
标签: c++ winapi filesystems symlink hardlink
来自这个不错的 linux 教程:
https://jackal.livejournal.com/2164247.html
获取inode号:
ls -i FILENAME
按inode编号按文件查找:
find / -inum INODE-NUM-FROM-ABOVE
请随意限制find 以加快搜索速度。
例子:
> ls -i myfile.csv
74714625 myfile.csv
> find ~/myfolder/ -inum 74714625
/home/me/myfolder/myfile.csv
/home/me/myfolder/another/path/another_filename_with_same_inode.csv
【讨论】:
符号链接:
您必须搜索所有硬盘等上的所有文件。并分别检查它们中的每一个。否则无法获取特定文件的符号链接列表。
对于 Linux,How do you determine using stat() whether a file is a symbolic link? 可能会有所帮助。
对于 Windows ......好吧,重解析点无法用一行来解释。
检查文件是否是来自 C++ 的符号链接并非易事。
硬链接:
Linux:再次(通常)不搜索所有文件并检查 inode 号是不可能的。
Windows:取决于使用的文件系统,FindFirstFileName 和 FindNextFileName
可能有用,但如前所述,它们并不总是有效(ReFS...)
【讨论】:
FILE_ATTRIBUTE_REPARSE_POINT 属性由 GetFileAttributes() 和 FindFirstFile()/FindNextFile() 检测到。硬链接也必须是可检测的(我不确定如何),因为命令行fsutil 工具有一个hardlink list 参数,可以找到给定文件的硬链接(至少在Win7/2008+ 上)和SysInternals 还有一个FindLinks 工具用于查找硬链接。
FILE_ATTRIBUTE_REPARSE_POINT (facepalm)。但是,检查它是符号链接还是其他类型的 RP 并不容易。是的,硬链接是可以检测到的,如答案中所述,但仅限于某些文件系统(NTFS 是的,ReFS 不是所有版本......)
FILE_ATTRIBUTE_REPARSE_POINT 属性时,来自FindFirstFile()/FindNextFile() 的WIN32_FIND_DATA 结构在dwReserved0 字段中指定Reparse Point Tag。可用标签之一是IO_REPARSE_TAG_SYMLINK。这是documented:“您可以通过测试标记值是否为 IO_REPARSE_TAG_SYMLINK 来确定重解析点是否为符号链接。”