我在.NET 4.0中使用DirectoryInfo和FileInfo來枚舉目錄樹中的文件,並且遇到PathTooLongException。簡化版本低於從PathTooLongException中檢索路徑信息
public static class Test
{
public static void Search(DirectoryInfo base)
{
foreach(var file in base.GetFiles())
{
try
{
Console.WriteLine(file.FullName);
} catch(PathTooLongException ex)
{
// What path was this?
}
}
foreach(var dir in base.GetDirectories())
{
Search(dir);
}
}
}
當拋出的錯誤,我想知道是什麼文件路徑導致的問題。顯然,我不能要求FullName
,因爲這是錯誤的。我可以從file.Name
得到名字,但是如果我無法得到路徑的其餘部分,因爲file.Directory
給出PathTooLongException
,即使DirectoryInfo
該文件被發現工作正常! (我不能使用它,因爲實際代碼要複雜得多)。
通過堆棧跟蹤看起來,它似乎正在使用一個內部路徑(我看到從調試保護file.FullPath
),並試圖從完整(超大)的路徑撕裂目錄。大部分問題似乎涉及System.IO.Path.NormalizePath
,我聽說在.Net 4.0中經歷了一些變化。我還沒有嘗試過這個框架的以前的版本。
我的問題:
- 我怎樣才能得到這個異常的完整路徑;它似乎通過了沒有任何有用的信息。
- 爲什麼框架需要限制路徑中的字符來切斷文件名?
在此先感謝您的幫助,
安迪
謝謝克里斯託弗,我擔心情況會如此。只是私下保留路徑並且不允許在沒有先驗證它的情況下訪問它,儘管它爲我創建了無效路徑就好了。 您指向的'LongPath'庫看起來很棒!不幸的是,我忘了提及所有路徑都是UNC,因此無法按原樣使用(還)。通過代碼來查看如何實現直接API會非常有用。 – Andyrooger 2012-03-07 09:49:35
@Andyrooger,是的,我忘了那個。我分叉了代碼,並在不久前添加了該代碼。你可以在codeplex項目中獲得代碼(http://longpaths.codeplex.com/)。使用源代碼,而不是發行版,我修復了一個愚蠢的錯誤。 – 2012-03-07 21:01:29
@ChristopherCurrens +1 FieldInfo提示! – 2013-06-11 19:09:31