一尘不染

确定两个路径是否引用C#中相同文件的最佳方法

c#

在即将发布的Java7中,提供了一个新的API,用于检查两个文件对象是否是相同的文件引用。

.NET框架中是否提供了类似的API?

我已经在MSDN上进行了搜索,但是没有什么启发我的。

我想简单一点,但我不想按文件名进行比较,这会导致硬/符号链接和不同样式的路径出现问题。(例如\\?\C:\C:\)。

我要做的只是防止重复的文件被拖放到我的链接列表中。


阅读 818

收藏
2020-05-19

共1个答案

一尘不染

据我所知(1)
(2)
(3)
(4),JDK7的方法是通过在文件上调用GetFileInformationByHandle并比较dwVolumeSerialNumber,nFileIndexHigh和nFileIndexLow。

每个MSDN:

您可以比较BY_HANDLE_FILE_INFORMATION结构中返回的VolumeSerialNumber和FileIndex成员,以确定两个路径是否映射到相同的目标。例如,您可以比较两个文件路径并确定它们是否映射到同一目录。

我不认为此功能由.NET包装,因此您必须使用P /
Invoke

它可能适用于网络文件,也可能不适用于网络文件。根据MSDN:

根据操作系统的基础网络组件和连接的服务器的类型,GetFileInformationByHandle函数可能会失败,返回给定文件的部分信息或完整信息。

快速测试表明,在使用SMB /
Samba连接的Linux系统上,该链接在符号链接上可以按预期(相同的值)工作,但是当使用指向同一文件的不同共享访问文件时,它无法检测到文件相同(
FileIndex相同,但VolumeSerialNumber不同)。

2020-05-19