2012-08-05 91 views
2

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

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

+2

符号链接怎么样?结? – 2012-08-05 12:10:18

+0

检查它们的大小或日期(如创建,修改)。如果全部平等,这是相同的文件。 – 2012-08-05 12:11:39

+0

符号链接和连接点我认为我不会遇到。 – 2012-08-05 12:27:28

回答

6

如果在这两个名称使用Path.GetFullPath他们应该解决相同的字符串:

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

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

+0

这不处理Windows中文件名不区分大小写的情况。在当前的.NET Framework实现中,即使Path.GetFullPath(@“c:\ a.txt”)不是Path.GetFullPath(@“C:\ A.TXT”), )相同的文件。 – 2017-10-16 04:32:37

+0

@Carl等于测试应该使用正确的比较选项当然。 – ChrisF 2017-10-16 06:35:59

4

也许这对你有用?

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

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

我认为它可行,但我不知道文件访问是否涉及这里,所以我宁愿去GetFullPath解决方案。然而,对于一个工作解决方案来说+1 – 2012-08-05 12:28:57

+2

文件访问被推迟到您尝试访问需要它的属性。 – 2012-08-05 13:09:12

2

是,使用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,所以通过使用==接线员会将情况相比较,只有不同的路径不会产生所需的结果。

相关问题