System.IO.PathTooLongException:「指定的路徑或文件名太長,或者二者都太長。徹底限定文件名必須少於 260 個字符,而且目錄名必須少於 248 個字符。」git
NET 4.5github
在C#API中讀取文件或文件夾時,徹底限定文件名必須少於 260 個字符,而且目錄名必須少於 248 個字符。(System.IO
源碼中作的限制)網絡
使用第三方開源庫ZetaLongPaths ,NuGet中使用1.0.0.24的版本,更高版本須要 NET 4.5.2 框架。框架
System.IO.FileInfo
的類,它包裝函數以處理文件路徑。System.IO.DirectoryInfo
的類,它包裝函數以處理文件夾路徑。System.IO.Path
的靜態函數,用於路徑。代碼示例及比較函數
ZetaLongPaths.ZlpPathHelper.Combine(Path, tpName); //System.IO.Path.Combine(Path, tpName); ZetaLongPaths.ZlpPathHelper.Combine(null, null, null, names.ToArray()); //System.IO.Path.Combine(names.ToArray()); ZetaLongPaths.ZlpIOHelper.GetFiles(dirpath, "*"); //System.IO.Directory.GetFiles(dirpath, "*.*"); ZetaLongPaths.ZlpPathHelper.GetFileNameWithoutExtension(mDir); //System.IO.Path.GetFileNameWithoutExtension(m_Dir); ZetaLongPaths.ZlpIOHelper.DeleteFile(filePath); //System.IO.File.Delete(filePath); var directory = new ZlpDirectoryInfo(dirPath); //var directory = new DirectoryInfo(dirPath); ZetaLongPaths.ZlpPathHelper.GetDirectoryPathNameFromFilePath(path); //System.IO.Path.GetDirectoryName(path); ZetaLongPaths.ZlpIOHelper.DirectoryExists(folderPath); //System.IO.Directory.Exists(folderPath); ZetaLongPaths.ZlpIOHelper.CreateDirectory(folderPath); //Directory.CreateDirectory(folderPath);
System.IO
的接口規範有不小的區別,使用時須要逐個確認並替換System.IO.File
)的相關操做的支持,例如使用File.Open(string path, FileMode mode)
或者new FileStream(string path, FileMode mode)
類型時,仍是會由於文件名長度問題,報長度或者其餘異常。使用第三方開源庫AlphaFS,它爲.NET平臺提供比標準System.IO
類更完整的Win32文件系統功能支持的功能。code
Alphaleonis.Win32.Filesystem
的類名以及接口很規範,可以無縫替換System.IO
庫比較大(359KB)blog
使用「\\?\」做爲文件名前綴並調用Windows API的Unicode版本接口
升級框架NET 4.6.2及其以上版本以解決上述bug事務