使用.Net验证路径相等性

时间:2011-09-08 08:07:48

标签: c# .net path

比较.Net中的两条路径以确定它们是否指向同一文件或目录的最佳方法是什么?

  1. 如何验证这些是否相同:

    c:\Some Dir\SOME FILE.XXX
    C:\\\SOME DIR\some file.xxx
    
  2. 更好:有没有办法验证这些路径指向某个网络驱动器上的同一文件:

    h:\Some File.xxx
    \\Some Host\Some Share\Some File.xxx
    
  3. 更新

    Kent Boogaart正确回答了我的第一个问题;但我仍然很想知道我的第二个问题是否有关于比较网络驱动器上文件和目录路径的解决方案。

    更新2(我的两个问题的综合答案):

    问题1:本地和/或网络文件和目录

    c:\Some Dir\SOME FILE.XXX
    C:\\\SOME DIR\some file.xxx
    

    答案:使用System.IO.Path.GetFullPath,例如:

    var path1 = Path.GetFullPath(@"c:\Some Dir\SOME FILE.XXX");
    var path2 = Path.GetFullPath(@"C:\\\SOME DIR\subdir\..\some file.xxx");
    
    // outputs true
    Console.WriteLine("{0} == {1} ? {2}", path1, path2, string.Equals(path1, path2, StringComparison.OrdinalIgnoreCase));
    

    问题2:本地和/或网络文件和目录

    答案:使用发布的GetPath方法 http://briancaos.wordpress.com/2009/03/05/get-local-path-from-unc-path/

9 个答案:

答案 0 :(得分:39)

var path1 = Path.GetFullPath(@"c:\Some Dir\SOME FILE.XXX");
var path2 = Path.GetFullPath(@"C:\\\SOME DIR\subdir\..\some file.xxx");

// outputs true
Console.WriteLine("{0} == {1} ? {2}", path1, path2, string.Equals(path1, path2, StringComparison.OrdinalIgnoreCase));

在Windows上忽略大小写只是一个好主意。您可以以类似的方式使用FileInfo.FullName,但Path将同时使用文件和目录。

不确定你的第二个例子。

答案 1 :(得分:7)

虽然这是一个旧帖子,因为我发现了一个。

使用Path.GetFullpath我可以解决我的问题 例如

Path.GetFullPath(path1).Equals(Path.GetFullPath(path2))

答案 2 :(得分:1)

你可以使用FileInfo!

string Path_test_1="c:\\main.h";
string Path_test_2="c:\\\\main.h";

var path1=new FileInfo(Path_test_1)
var path2=new FileInfo(Path_test_2)
if(path1.FullName==path2.FullName){

//two path equals
}

答案 3 :(得分:1)

使用扩展方法

的语法很好

你可以有这样一个很好的语法:

string path1 = @"c:\Some Dir\SOME FILE.XXX";
string path2 = @"C:\\\SOME DIR\subdir\..\some file.xxx";

bool equals = path1.PathEquals(path2); // true

实施扩展方法:

public static class StringExtensions {
    public static bool PathEquals(this string path1, string path2) {
        return Path.GetFullPath(path1)
            .Equals(Path.GetFullPath(path2), StringComparison.InvariantCultureIgnoreCase);
    }
}

感谢Kent Boogaart提供了很好的示例路径。

答案 4 :(得分:0)

正如其他人所报告的那样,Path.GetFullPathFileInfo.FullName提供了本地化文件的规范化版本。规范化UNC路径进行比较是相当多的,但幸运的是,Brian Pedersen已经发布了一个方便的MRU(Method Ready to Use)来完成您在博客上所需要的,恰当地标题为Get local path from UNC path。将此代码添加到代码后,您将拥有一个静态GetPath方法,该方法将UNC路径作为其唯一参数,并将其规范化为本地路径。我给了它一个快速的尝试,它的工作方式与广告一样。

答案 5 :(得分:0)

我也遇到了这个问题,但是我使用Uri类尝试了另一种方法。到目前为止,我发现它非常有前途:)

var sourceUri = new Uri(sourcePath);
var targetUri = new Uri(targetPath);

if (string.Compare(sourceUri.AbsoluteUri, targetUri.AbsoluteUri, StringComparison.InvariantCultureIgnoreCase) != 0 
|| string.Compare(sourceUri.Host, targetUri.Host, StringComparison.InvariantCultureIgnoreCase) != 0)
            {
// this block evaluates if the source path and target path are NOT equal
}

答案 6 :(得分:0)

我用来确定两个路径字符串是否指向同一位置的一个非常简单的方法是在 Path1 中创建一个临时文件,然后查看它是否出现在 Path2 中。它仅限于您具有写访问权限的位置,但如果您可以接受,那就很容易了!这是我的 VB.NET 代码(可以轻松转换为 C#)……

Public Function SamePath(Path1 As String, Path2 As String) As String

'  Returns: "T" if Path1 and Path2 are the same,
'           "F" if they are not, or
'               Error Message Text

Try
   Path1 = Path.Combine(Path1, Now.Ticks.ToString & ".~")
   Path2 = Path.Combine(Path2, Path.GetFileName(Path1))

   File.Create(Path1).Close

   If File.Exists(Path2) Then
      Path2 = "T"
   Else
      Path2 = "F"
   End If

   File.Delete(Path1)

Catch ex As Exception
   Path2 = ex.Message

End Try

Return Path2

End Function

我将结果作为字符串返回,因此如果用户输入一些垃圾,我可以提供错误消息。我还使用 Now.Ticks 作为“保证”唯一的文件名,但还有其他方法,例如 Guid.NewGuid。

答案 7 :(得分:-1)

确保两个路径引用同一文件的唯一方法是打开和比较文件。至少你可以实例化FileInfo对象并比较属性,如: CreationTime, FullName, Size等。在某些近似值中,它可以保证两条路径引用同一个文件。

答案 8 :(得分:-3)

为什么不创建每个文件的哈希值并进行比较呢?如果它们是相同的,您可以合理地确定它们是相同的文件。