2012-08-05 140 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,所以通過使用==接線員會將情況相比較,只有不同的路徑不會產生所需的結果。

相關問題