错误及异常处理-[PathTooLongException]指定的路径或文件名太长
2024-08-24 08:20:50
错误信息
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
参考
最新文章
- GridView的使用(高度封装,不怎么灵活,repeat可替代)
- 【原】EasyUI ComboGrid 集成分页、按键示例
- Python基础-字符串格式化_百分号方式_format方式
- select选择框内容左右移动添加删除栏(升级)
- Tomcat Clustering - A Step By Step Guide --转载
- IDEA 常见文件类型的图标介绍
- 如何管理好项目的DLL
- hbase与Hadoop
- MonoBehaviour
- java 操作sqllite的数据库
- OpenJudge 2721 忽略大小写比较字符串大小
- hibernate和mybatis思想,区别,优缺点
- 2016年gift上线相关知识点记录
- 学习笔记:javascript body常用事件
- 【BZOJ3993】 星际战争
- python访问mysql和redis
- 旧调重弹Hibernate与Ibatis区别——深入架构设计
- Devops路线
- Widget Factory (高斯消元解线性方程组)
- BZOJ5287 HNOI2018毒瘤(虚树+树形dp)
热门文章
- css中的三种基本定位机制
- Requests接口测试-对cookies的操作处理(二)
- ASP.NET’s compilation system
- kcp源码segment头文件各字段含义
- 编写高质量代码改善C#程序的157个建议——建议141:不知道该不该用大括号时,就用
- Reporting Service服务SharePoint集成模式安装配置(9、PowerPivot for SharePoint 安装配置详细)
- 微软编程一小时 题目2: Longest Repeated Sequence
- 一文读懂加固apk的开发者是怎么想的
- Math.round(11.5)
- 「HNOI 2014」米特运输