【问题标题】:Check if two file names reference to the same file检查两个文件名是否引用同一个文件
【发布时间】:2012-08-05 12:08:26
【问题描述】:

在 C# (4.0) 中有没有办法检查两个文件名是否引用同一个文件,最好不打开它们?

即如果相对路径指向 d,d:\x.txt 应该等于 x.txt 或 ../x.txt。

【问题讨论】:

  • 符号链接呢?路口?
  • 检查它们的大小或日期(如创建、修改)。如果都相等,这是同一个文件。
  • 我认为我不会遇到的符号链接和联结。
  • 检查每个属性不是我想要的(这就像拥有文件访问权限);也许我应该在我的问题中添加它。

标签: c# file c#-4.0 io


【解决方案1】:

如果您在两个名称上使用Path.GetFullPath,它们应该解析为相同的字符串:

string fullPath1 = Path.GetFullPath(absolutePath);
string fullPath2 = Path.GetFullPath(relativePath);

那么fullPath1 应该等于fullPath2 如果它们引用同一个文件。确保进行不区分大小写的比较,因为 Windows 文件名不区分大小写。

【讨论】:

  • 这不处理 Windows 中文件名的大小写不敏感问题。在当前的 .NET Framework 实现中,Path.GetFullPath(@"c:\a.txt") 不等于 Path.GetFullPath(@"C:\A.TXT"),即使它们(可能)是同一个文件。
  • @Carl 当然应该使用正确的比较选项来完成等号测试。
【解决方案2】:

也许这对你有用?

FileInfo file1 = new FileInfo(@"D:\x.txt");
FileInfo file2 = new FileInfo(@"..\x.txt");

if (file1.FullName == file2.FullName) {
    // yes, they match..

【讨论】:

  • 我觉得可行,但不知道这里是否涉及文件访问,所以我宁愿去GetFullPath解决方案。但是 +1 是一个可行的解决方案。
  • 文件访问被推迟,直到您尝试访问需要它的属性。
【解决方案3】:

是的,使用Path.GetFullPath,然后进行不区分大小写的比较:

var file1 = Path.GetFullPath(@"C:\TEMP\A.TXT");
var file2 = Path.GetFullPath(@"a.txt"); // Assuming current directory is C:\TEMP

// Test 1 (good)
if (file1.Equals(file2, StringComparison.OrdinalIgnoreCase))
{
   Console.WriteLine("Test 1: they match");
}

// Test 2 (fails when file paths differ by case)
if (file1 == file2)
{
    Console.WriteLine("Test 2: they match");
}

大多数人在不区分大小写的文件系统上运行 .NET,因此使用 == 运算符比较仅大小写不同的路径不会产生所需的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多