2011-09-22 140 views
2

要超過c#中的最大路徑限制,您顯然需要將驅動器路徑與@"\\?\"連接起來。如果我這樣做,那麼我與在前面避免最大字符數限制c#

\\\\?\\\\\\server\\share\\...

現在如果我期待已久的文件/文件夾,因爲在路徑非法charachters它會失敗以下驅動器路徑(我假設?)那麼我如何才能正確地採用微軟網站(http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx)中列出的方法?

foreach (string filePath in Directory.GetFiles(folder)) 
{ 
    String s = @"\\?\" + filePath; 

    if (filePath.Length > 255) 
    { 
     Console.WriteLine(filePath); 
    } 

    if (File.Exists(filePath)) 
    { 
     FileInfo finfo = new FileInfo(s); 
     folderSize += finfo.Length; 
    } 
} 

foreach (string dir in Directory.GetDirectories(folder)) 
    folderSize += GetDirectorySize(dir); 
+0

你可以在你嘗試使用長路徑的地方顯示一些代碼嗎?你是在創建一個文件或文件夾還是讀取嵌套在很長路徑中的現有文件?閱讀下面的答案。 –

+0

我想計算一組共享驅動器的大小,它們在某些情況下非常大,因此路徑通常超過255個字符 – James

回答

1

我不認爲你應該路徑前添加所有的斜槓,我想你不明白一切什麼是寫在MSDN這裏:

最大路徑長度限制

在Windows API中(在以下 段落中討論了一些例外情況),路徑的最大長度爲MAX_PATH,即 定義爲260個字符。本地路徑的結構如下 順序:驅動器號,冒號,反斜槓,由 反斜槓分隔的名稱組件,以及終止空字符。例如,驅動器D上的最大路徑 是「D:\某些256個字符的路徑字符串」 其中「」表示當前系統代碼頁的不可見的終止空字符。 (字符<>在這裏用於 視覺清晰度,並不能有效的路徑字符串的一部分。)

注:文件I /在Windows API轉換O功能「/」到「\」的一部分 將名稱轉換爲NT樣式的名稱,除非使用前綴 「\?\」前綴,如以下各節中所述。

Windows API有很多功能,它們的Unicode版本也有 允許最大總長度爲 32,767個字符的擴展長度路徑。此類路徑由用反斜槓分隔的組件 組成,每個組件由GetVolumeInformation 函數(此值通常爲255個字符)的 lpMaximumComponentLength參數返回的值。要指定 擴展長度路徑,請使用「\?\」前綴。例如,「\?\ D:\很 長路徑」。

注:的32,767個字符的最大路徑是近似的,因爲 的「\ \?」前綴可以由系統在 運行時可擴展到更長的字符串,而且這種擴張適用於總長度。

,你可以從中讀到,:

Windows API的有很多功能也使用Unicode版本 允許擴展長度路徑的 32,767個字符的最大路徑總長度。

這是您的問題的關鍵,如果您需要創建或訪問超過260個字符的路徑,您應該使用特定的Windows API。

+2

而且您需要直接(即P/Invoke)API:.NET類不支持擴展長度路徑(就像它們不支持備用數據流一樣)。 – Richard

+0

任何想法哪一個具體請:) – James

+0

顯示您的代碼編輯您的問題上面。我們必須看到你在做什麼才能提出更換建議。這裏沒有水晶球... –

2

標準System.IO不支持超過260個字符的路徑。

但似乎有一個與擴展長度路徑支持庫: http://alphafs.codeplex.com/

我個人還沒有嘗試過這麼遠。