错误信息

System.IO.PathTooLongException:“指定的路径或文件名太长,或者两者都太长。完全限定文件名必须少于 260 个字符,并且目录名必须少于 248 个字符。”

环境

NET 4.5

原因分析

在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文件系统功能支持的功能。

功能

  • 支持扩展长度路径(最长32000个字符)
  • 创建连接点/硬链接
  • 访问隐藏的卷
  • 卷的枚举
  • 事务性文件操作
  • 支持NTFS备用数据流(文件/文件夹)
  • 访问网络资源(SMB / DFS)
  • 创建和访问名称中包含前导/尾随空格的文件夹/文件
  • 支持自定义筛选和错误报告/恢复的文件夹/文件枚举器(访问被拒绝的例外)

优点

  • Alphaleonis.Win32.Filesystem的类名以及接口很规范,能够无缝替换System.IO
  • 功能全面强大

缺点

库比较大(359KB)

方案3

使用“\\?\”作为文件名前缀并调用Windows API的Unicode版本

方案4

升级框架NET 4.6.2及其以上版本以解决上述bug

参考

错误及异常处理-[PathTooLongException]指定的路径或文件名太长的更多相关文章

  1. [Python学习]错误篇二:切换当前工作目录时出错——FileNotFoundError: [WinError 3] 系统找不到指定的路径

    REFERENCE:<Head First Python> ID:我的第二篇[Python学习] BIRTHDAY:2019.7.13 EXPERIENCE_SHARING:解决切换当前工 ...

  2. Yii中的错误及异常处理

    Yii中的错误及异常处理 Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler, set_error_handler实现的. ...

  3. PHP10 错误和异常处理

    学习要点 修改错误报告级别 写错误日志 异常处理实现 自定义异常 捕获多路异常   错误处理 定义 错误:开发过程中的失误.用户操作引起的错误. 错误产生原因 语法错误:开发环境提示,未修正则脚本无法 ...

  4. URL 路径长度限制(错误:指定的文件或文件夹名称太长)

    本节讨论 URL 的构成.SharePoint 2010 构建 URL 的方式.URL 的编码和加长以及作为其他 URL 中的参数传递的方式. SharePoint URL 的构成 SharePoin ...

  5. log4j:ERROR setFile(null,true) call failed.java.io.FileNotFoundException: ..\logs\2010-1-19.log (系统找不到指定的路径。)

    log4j:ERROR setFile(null,true) call failed.java.io.FileNotFoundException: ..\logs\2010-1-19.log (系统找 ...

  6. (转)如何在eclipse的配置文件里指定jdk路径

    本文转载自:http://songguoliang.iteye.com/blog/1752519 运行eclipse时报如下错误: 在eclipse的配置文件里指定jdk路径,只需在eclipse的配 ...

  7. Maven项目pom.xml文件报xxx\target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径)

    在今天的学习Maven项目中遇到的这个错误:pom.xml文件报xxx\target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径) 在Maven项目学习中,缓存问 ...

  8. Golang错误和异常处理的正确姿势

    Golang错误和异常处理的正确姿势 错误和异常是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从 ...

  9. 【PHP】解析PHP中的错误和异常处理

    目录结构: contents structure [-] 错误级别 自定义处理器 设置异常日志 自定义异常类 在这篇文章中,笔者将会阐述PHP中的异常处理,希望能够对你有所帮助. 1.错误级别 PHP ...

随机推荐

  1. VWAP算法(成交量加权平均价)

    算法交易其实主要是用在基金公司.券商量化比较多.例如我已经选好股,要大量买入,但是单凭交易员的操作海量单而且要完成买入100万股这些的操作是有点的困难的.那么这时候怎样解决拆单,防止冲击成本的问题呢? ...

  2. JSTL 引入

    首先要明白jstl有如下版本:  jstl1.0的引入方式为: <taglib uri="http://java.sun.com/jstl/core" prefix=&quo ...

  3. 可epoll队列

    什么是可epoll队列? 就可以使用epoll来监控队列中是否有数据的队列,当然也支持select和poll. 应用场景 一个线程,需要将队列(共享内存队列或普通队列均可)中的数据取出来,然后通过网络 ...

  4. 编写高质量代码改善C#程序的157个建议——建议65:总是处理未捕获的异常

    建议65:总是处理未捕获的异常 处理为捕获的异常是每个应用程序具备的基本功能,C#在APPDomain提供了UnhandledException事件来接收未捕获到的异常的通知.常见的应用如下: sta ...

  5. [LeetCode 题解]: pow(x,n)

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Implement po ...

  6. C#面向对象的三大基本特征

    封装: 封装是指将数据与具体操作的实现代码放在某个对象内部,使这些代码的实现细节不被外界发现(可以使代码更加安全),外界只能通过接口使用该对象,而不能通过任何形式修改对象内部实现,正是由于封装机制,程 ...

  7. OO 抽象方法与虚方法的区别

     抽象方法与虚方法的区别 抽象方法与虚方法的区别: 一.抽象方法: 1.只能在抽象类中定义: 2.不能有方法的实现:(方法体)[因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不 ...

  8. 二十一、Node.js-EJS 模块引擎

    初识 EJS 模块引擎 我们学的 EJS 是后台模板,可以把我们数据库和文件读取的数据显示到 Html 页面上面.它是一个第三方模块,需要通过 npm 安装https://www.npmjs.com/ ...

  9. GEEK UNINSTALLER

    geek.exe https://geekuninstaller.com/download Event log message indicates that the Windows Installer ...

  10. Android源码:(一) 安卓2.1到4.4操作系统通用的Actionbar实现的tab导航例子。

    说一下我在完成这个例子之前的尝试吧 一,修改“actionbarsherlock”的导航例子.我在实现这个例子之前,尝试过“actionbarsherlock”,修改它的一个tab导航的例子,修改成功 ...