2009-08-31 64 views

回答

8

從我所知道的事情來看,這並不容易。雖然可以使用phoenix提到的解決方法,但文件名處理是不可能的。內部每個使用文件名的類都會檢查長文件名。

您可以實例化FileInfo並使用反射填充私有成員(但不建議這樣做),並將FileInfo指向具有長路徑的文件。但是,當您嘗試使用此對象時,您仍然會收到PathTooLongException異常,因爲例如,Path類(由FileInfo嚴重使用)會在每個方法調用中檢查長路徑。

所以,只有一種正確的方式來獲得無問題的長路徑支持 - 實現您自己的一組類,它們將模擬FileInfo的行爲。這不是很複雜(只有安全可能),但費時。

更新:這裏甚至是兩個準備方案來解決這個問題:AlpfaFSZeta Long Paths

+0

+1; Zeta Long Paths鏈接給了我我需要的東西。 FindFirstFile API調用是複製FileInfo的關鍵元素。 – 2011-11-02 22:41:22

+0

AlphaFS爲我做了訣竅。謝謝 – bjoern 2013-05-29 17:50:55

7

在這裏,在工作中,我們處理長路徑相當頻繁,因此,我們必須從根本上推出我們自己的System.IO做。不是,但我們重寫了File,Directory,FileInfo,DirectoryInfo和Path等等。基本前提是,從Win32 API的角度來看,這一切都是可能的,所以在一天結束時你真正需要做的就是調用Win32 API函數的Unicode版本,然後你就很好。這是很多的工作,有時可能會讓屁股感到痛苦,但實際上沒有更好的辦法。

+0

你的新類看起來如何,它們是100%手寫的,還是你在File類中內建File類的子類? – 2009-08-31 13:55:51

+3

那麼,文件實際上是一個靜態類,所以你不能從它繼承,但大多數你認爲子類化(FileInfo,DirectoryInfo)的類是密封的,所以你不能繼承它們。我們從頭開始編寫它們。我不會撒謊,我們確實使用反射器ALOT :) – BFree 2009-08-31 13:59:48

+0

Doh,是的,靜態:)很酷,很好的答案。 – 2009-08-31 14:04:12

0

有克服長文件名的問題Microsoft TechNet上一個偉大的圖書館,這就是所謂的 Delimon.Win32.I​O 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錯誤

1

我只需要使用FullName屬性,但也收到PathTooLongException。

使用反射來提取FULLPATH值就足以解決我的問題:

private static string GetFullPath(FileInfo src) 
{ 
    return (string)src.GetType() 
     .GetField("FullPath", BindingFlags.Instance|BindingFlags.NonPublic) 
     .GetValue(src); 
}