2014-03-13 57 views
4

我有一個在c#中獲取最終文件名的問題。如何獲得最終文件名

例如:

如果用戶鍵入兩個文件名:

「ASD」和 「ASD ..」

「ASD」 和 「ASD  」(兩個空格)

然後方法返回Path.GetFileName 「ASD」, 「ASD ..」, 「ASD」, 「asd  」(兩個空格)。

保存一個硬盤驅動器(例如,使用的StreamWriter)上後,再有就是隻有一個文件「ASD」

我如何檢查輸入文件的最終名字?我想還有很多其他的例子,我不可能手動正確地做。

編輯

我用它來比較兩個文件名,並用GetFileName返回: 爲A.TXT - A.TXT 爲A.TXT - A.TXT

但保存後的同一個文件。比較必須忽略大小寫。

+0

讓我看看你的代碼,這樣我們就可以看到,並幫助您 –

+3

我不認爲接近的選票是有道理的。這是一個關於編程的合法問題,並且實際上不需要任何示例代碼。問題很明顯:例如,當SaveFileDialog將文件名報告爲「ads ...」並保存時,文件將被操作系統重命名爲「ads」。你怎麼能確定這發生了? –

+3

有趣的問題。 msdn的引用中沒有(明顯)記錄行爲。這當然可以創建一個文件,只要NTFS(或FAT32?)在它的名字尾隨空格而言,我只是做了它在cygwin外殼。但在資源管理器似乎處理的文件名相同的文件,並拒絕當我嘗試添加一個空格(「源和目標是相同的文件」),將其重命名。類似於Windows下的Java開發人員可能會遇到的不一致的案例處理。 –

回答

4

有在淨Path類有趣的內部NormalizePath方法。如果你不介意反思,你可以使用它。

string fileName = "asd.."; 
MethodInfo normalizePathMathod = typeof(Path).GetMethod("NormalizePath", BindingFlags.Static | BindingFlags.NonPublic, null, new Type[] { typeof(string), typeof(bool) }, null); 
string normalizedFilePath = (string)normalizePathMathod.Invoke(null, new object[] { fileName, true }); 
string normalizedFileName = Path.GetFileName(normalizedFilePath); 

剛剛找到更好的解決方案,沒有反思。 Path.GetFullPath調用NormalizePath方法。因此,我們可以將其更改爲:

string fileName = "asd.."; 
string normalizedFilePath = Path.GetFullPath(fileName); 
string normalizedFileName = Path.GetFileName(normalizedFilePath); 
+0

很不錯,沒想到它 – samy

+0

Yest,這工作很不錯,謝謝:) – AdamF

+0

很好的解決方案,尤其是一個沒有反思! –

0

在Windows 7下,我無法重新命名要測試的文件。 (它恢復測試),所以我認爲重命名來自強制執行文件特定規則而非.Net的文件系統。

即使使用interop調用,也不能創建帶尾點的文件。我真的不認爲你可以從.Net裏面得到正確的文件名。 [編輯:其實Ulugbek的答案顯示了一個很好的方法]

一個解決方案可能是寫一個空名稱到臨時目錄的文件,並檢查生成的文件名是什麼在刪除它之前。

下面是一些更多的信息:Strange behavior from .NET regarding file paths

2

如果使用FileStream打開該文件,然後你可以使用FileStream.Name屬性流被打開後能得到「最終」的文件名。

粗例如:

SaveFileDialog sDlg = new SaveFileDialog(); 

if (sDlg.ShowDialog() == DialogResult.OK) 
{ 
    // E.g., sDlg.FileName returns "myFile..." 
    FileStream f = new FileStream(sDlg.FileName, FileMode.Create); 
    Console.WriteLine(f.Name); // then f.Name will return "myFile" 
    f.Close(); 
    Console.ReadLine(); 
} 
sDlg.Dispose();