如何使用(以避免PathTooLongException):如何使用FileInfo類避免PathTooLongException?
System.IO.FileInfo
與超過260個字符更大的路徑?
是否有類似的類/方法返回FileInfo類的相同結果?
如何使用(以避免PathTooLongException):如何使用FileInfo類避免PathTooLongException?
System.IO.FileInfo
與超過260個字符更大的路徑?
是否有類似的類/方法返回FileInfo類的相同結果?
從我所知道的事情來看,這並不容易。雖然可以使用phoenix提到的解決方法,但文件名處理是不可能的。內部每個使用文件名的類都會檢查長文件名。
您可以實例化FileInfo並使用反射填充私有成員(但不建議這樣做),並將FileInfo指向具有長路徑的文件。但是,當您嘗試使用此對象時,您仍然會收到PathTooLongException異常,因爲例如,Path類(由FileInfo嚴重使用)會在每個方法調用中檢查長路徑。
所以,只有一種正確的方式來獲得無問題的長路徑支持 - 實現您自己的一組類,它們將模擬FileInfo的行爲。這不是很複雜(只有安全可能),但費時。
更新:這裏甚至是兩個準備方案來解決這個問題:AlpfaFS和Zeta Long Paths
在這裏,在工作中,我們處理長路徑相當頻繁,因此,我們必須從根本上推出我們自己的System.IO做。不是,但我們重寫了File,Directory,FileInfo,DirectoryInfo和Path等等。基本前提是,從Win32 API的角度來看,這一切都是可能的,所以在一天結束時你真正需要做的就是調用Win32 API函數的Unicode版本,然後你就很好。這是很多的工作,有時可能會讓屁股感到痛苦,但實際上沒有更好的辦法。
你的新類看起來如何,它們是100%手寫的,還是你在File類中內建File類的子類? – 2009-08-31 13:55:51
那麼,文件實際上是一個靜態類,所以你不能從它繼承,但大多數你認爲子類化(FileInfo,DirectoryInfo)的類是密封的,所以你不能繼承它們。我們從頭開始編寫它們。我不會撒謊,我們確實使用反射器ALOT :) – BFree 2009-08-31 13:59:48
Doh,是的,靜態:)很酷,很好的答案。 – 2009-08-31 14:04:12
有克服長文件名的問題Microsoft TechNet上一個偉大的圖書館,這就是所謂的 Delimon.Win32.IO Library (V4.0),它有其自身的主要方法版本從System.IO
例如,你將取代:
System.IO.Directory.GetFiles
與
Delimon.Win32.IO.Directory.GetFiles
這將讓你^ h和長文件和文件夾。
從網站:
Delimon.Win32.IO取代System.IO和 支持的基本文件功能文件&文件夾名最多可達32,767個字符。
此庫是在.NET Framework 4.0上編寫的,可以在x86 & x64系統上使用 。文件&標準 System.IO名稱空間的文件夾限制可以使用文件名中包含260個字符且文件名爲 ,文件夾名稱中包含240個字符的文件(MAX_PATH通常爲 配置爲260個字符)。通常情況下,您遇到了標準.NET庫出錯時出現的System.IO.PathTooLongException錯誤 。
我只需要使用FullName屬性,但也收到PathTooLongException。
使用反射來提取FULLPATH值就足以解決我的問題:
private static string GetFullPath(FileInfo src)
{
return (string)src.GetType()
.GetField("FullPath", BindingFlags.Instance|BindingFlags.NonPublic)
.GetValue(src);
}
+1; Zeta Long Paths鏈接給了我我需要的東西。 FindFirstFile API調用是複製FileInfo的關鍵元素。 – 2011-11-02 22:41:22
AlphaFS爲我做了訣竅。謝謝 – bjoern 2013-05-29 17:50:55