2013-07-08 94 views
1

如何從文件路徑獲取文件名,可以從不同的OSX或Windows上載文件。
什麼想實現什麼是挑戰如下:無法從文件路徑獲取文件名

  • 我的目標是清理的文件名,如果有任何非法字符。 示例:OSX允許\以及windows文件系統不允許的其他幾個字符。 alg用_代替\
  • 有時某些瀏覽器(IE)將整個路徑作爲文件名發送到我的代碼。所以,如果我從網絡中的窗戶上傳共享文件,IE發送名稱爲\\\\servername\\folder\\filenmae.txt

- 我無法的FileInfo或路徑中使用,因爲文件名從OSX未來能有非法字符,如|><,因爲如果Mac OSX中文件名的名稱是\\path\ex\file,fileinfo或路徑會給我「文件」作爲文件名而不是整個名稱。

- 現在,如果文件名有:\路徑,我可以很容易地提取使用 filename.Substring(filename.LastIndexOf(@"\") + 1)
文件名 - 但我的問題是共享文件,因爲共享的文件完整路徑模式在Windows可以是OSX中的文件名。

我怎樣才能得到全名?
任何建議,將不勝感激。

+3

您無法知道'\\ a \ b \ c.txt'是否是Windows的完整路徑或來自* nix的異常文件名。 – SLaks

+0

在OSX中應用於文件名的規則是什麼? –

+0

谷歌請!,我知道:-) – din

回答

0

感謝所有的回覆,特別感謝@Dour High Arch。最終找出解決方案。使用fileInfo類,也可以使用Path來完成,但尚未經過測試。

try 
{ 
    FileInfo fileInformation = new FileInfo(tempFileName); 
    String directory = fileInformation.DirectoryName; 
    if (tempFileName.StartsWith(directory)) 
    { 
    filename = fileInformation.Name; 
    } 
} 
catch (Exception arugmentException) 
{ 
    if (!((arugmentException is ArgumentException) || 
    (arugmentException is NotSupportedException))) throw; 
} 
1

正如其他人所指出的;這是行不通的。您無法創建適用於所有操作系統的文件名,甚至無法創建可在單個操作系統中的所有文件系統上運行的文件名。我遇到了這個問題,試圖將NTFS文件從Windows複製到ISO 9660驅動器。

不要試圖「清理」文件名;規則太不可靠,並且跨文件系統衝突。使用您的操作系統的API來構建文件,如System.IO.Path.GetTempFileNameSystem.Windows.Controls.OpenFileDialog。如果您嘗試以編程方式構造文件名,請將您認爲可以在所有客戶端文件系統上運行的名稱(例如「MyFile」加上遞增順序號或十六進制GUID)傳遞給API,並在文件系統異常工作。

如果您要跨文件系統複製文件,最好將原始文件名存儲爲向用戶顯示,並將其用作「文件保存」對話框等的默認文件名,但不要再寫依靠它們的程序。

+0

我明白,但是,如果有人從OS X上以文件名文本<>/\ txt上傳文件,而另一個人試圖在Windows上下載,會怎麼樣。 (忽略我如何將它存儲在服務器上) – din

+0

在用戶界面中顯示該用戶名爲「text <>/\ txt」。如果你試圖在Windows上保存它,它會拋出,並且你將不得不讓用戶再試一次或者創建你自己的名字。但是,這可能會發生在用戶的任何文件名中;名稱是否來自不同的文件系統並不重要。 –

+0

好主意,但我的任務是重命名這些文件。截至目前臨時解決方案 - 嘗試{filename = path.getFileName(fileName)} catch(Exception e){if(!(e是ArgumentException))throw;} filename = renameFileName(fileName); – din