錯誤及異常處理-[PathTooLongException]指定的路徑或文件名太長

錯誤信息

System.IO.PathTooLongException:「指定的路徑或文件名太長,或者二者都太長。徹底限定文件名必須少於 260 個字符,而且目錄名必須少於 248 個字符。」git

環境

NET 4.5github

緣由分析

在C#API中讀取文件或文件夾時,徹底限定文件名必須少於 260 個字符,而且目錄名必須少於 248 個字符。(System.IO源碼中作的限制)網絡

解決方案

方案1

使用第三方開源庫ZetaLongPaths ,NuGet中使用1.0.0.24的版本,更高版本須要 NET 4.5.2 框架。框架

功能:

  • ZlpFileInfo- 相似於System.IO.FileInfo的類,它包裝函數以處理文件路徑。
  • ZlpDirectoryInfo- 相似於System.IO.DirectoryInfo的類,它包裝函數以處理文件夾路徑。
  • ZlpIOHelper-一組靜態函數,以提供相似的功能,做爲ZlpFileInfo與ZlpDirectoryInfo類,但在靜態上下文。
  • ZlpPathHelper- 一組相似於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);

優勢

  • 能知足大部分文件和文件夾的操做
  • 輕量(65KB)

缺點

  • System.IO的接口規範有不小的區別,使用時須要逐個確認並替換
  • 缺乏對文件流(System.IO.File)的相關操做的支持,例如使用File.Open(string path, FileMode mode)或者new FileStream(string path, FileMode mode)類型時,仍是會由於文件名長度問題,報長度或者其餘異常。

方案2

使用第三方開源庫AlphaFS,它爲.NET平臺提供比標準System.IO類更完整的Win32文件系統功能支持的功能。code

功能

  • 支持擴展長度路徑(最長32000個字符)
  • 建立鏈接點/硬連接
  • 訪問隱藏的卷
  • 卷的枚舉
  • 事務性文件操做
  • 支持NTFS備用數據流(文件/文件夾)
  • 訪問網絡資源(SMB / DFS)
  • 建立和訪問名稱中包含前導/尾隨空格的文件夾/文件
  • 支持自定義篩選和錯誤報告/恢復的文件夾/文件枚舉器(訪問被拒絕的例外)

優勢

  • Alphaleonis.Win32.Filesystem的類名以及接口很規範,可以無縫替換System.IO
  • 功能全面強大

缺點

庫比較大(359KB)blog

方案3

使用「\\?\」做爲文件名前綴並調用Windows API的Unicode版本接口

方案4

升級框架NET 4.6.2及其以上版本以解決上述bug事務

參考

相關文章
相關標籤/搜索