一、前言

超长路径(MAX_PATH)的问题,在很多地方都可能遇到,常见的解决办法无非三种:添加前缀\\?\、app.config添加配置、修改注册表等。

而对于其它第三方的DLL,我们如何去从外部解决呢?答案是:反射。

本篇文章,我们就以DotNetZip为例,一步步来解决超长路径的问题。

**相信看完的你,一定会有所收获!

**

本文地址:https://www.cnblogs.com/lesliexin/p/18930533

二、一步步定位问题

首先,我们看下使用DotNetZip的ZipEntry.AddDictionary()方法添加一个目录后,相关属性的变化。

我们可以看到,在添加前,ZipFile.Entries是空的。

在添加后,变化如下:

会遇到超长路径(MAX_PATH)报错,肯定会有一个完整的路径,当然存在临时拼接的情况,但是我们先找一找。

最后,我们在“非公开成员”中找到一个属性:LocalFileName,其值正是完整的文件路径,如下图所示:

为了方便观察,我们将LocalFileName属性置顶显示:

之后我们就可以看到,默认显示的都是LocalFileName了:

现在我们找到这个关键的LocalFileName,虽然还不能百分百确定和这有关,但是可以以此为准进行后面的排查和验证了。

三、反编译梳理逻辑

像DotNetZip,是开源的,我们可以直接找到源码来查看,对于非开源的,我们就只能反编译了。

这里常用的工具是dnSpy,我们使用dnSpy打开DotNetZip,然后定位到ZipEntry,再找到LocalFileName属性:

可以看到只有get,没有set,这样的话,如果直接反射操作此属性,则需要额外的添加set访问器,非常麻烦,此时不作考虑。

我们再看,LocalFileName其实是返回的变量:_LocalFileName,我们再找下此变量:

这样的话就简单了,我们反射直接操作此变量:

我们在处理时,先进行判断是否超长,再反射处理,因为反射是很耗资源的。

至于扩展方法,定义如下:

说一下这里面为什么要以248作为判断条件,是因为260是文件路径限制,而对于目录则是以248为限制,所以我们以最小的为主进行判断。

四、验证

这里就不贴图了,验证发现已经可以正常处理超长路径了,不会再报错了。

在解决此问题时,其实也是会捋一下相关的代码逻辑的,看看是不是真的只处理此变量就行了,只是本次这个很确定,再捋代码流程也没必要,也不是本文的重点,就不再赘述了。

五、开源

因为DotNetZip已经不再积极维护,且Nuget上的版本也标记了弃用和风险,所以也就不提PR了,

但在这么多压缩解压缩库中,DotNetZip在易用性上是无与伦比的,所以在很多时候用用还是挺不错的。也基于此想法,正好也将自己之前封装的方法给开源了吧,基于DotNetZip,就两个方法:Zip、UnZip。简单易用、解决了超长路径(MAX_PATH)问题、支持密码、分卷。

开源地址:https://gitee.com/lesliexin/lesliexin.simplezip

NuGet:https://www.nuget.org/packages/LeslieXin.SimpleZip

六、结语

这次也是遇到了这个超长路径(MAX_PATH)的问题,才想起来修复下,顺便也开源下自己的库。

本篇文章最重要的是给读者一个遇到超长路径(MAX_PATH)问题时一个实操指导,毕竟此问题不止会发生在DotNetZip中,可能发生在任何与文件路径相关的地方,当再次遇到此问题时,该如何一步步去排查定位和处理。

感谢大家的观看,本人水平有限,文章不足之处欢迎大家评论指正。

-[END]-

(原创)[C#]一步步解决DotNetZip因超长路径(MAX_PATH)报错的问题。的更多相关文章

  1. 解决Sublime包管理package control 报错 There are no packages available for installation

    解决Sublime包管理package control 报错 There are no packages available for installation 真的是哔了狗了,要不是我机智的重新安装了 ...

  2. 解决Maven项目中的无故报错的方法

    解决Eclipse+maven中的无故报错 错误: One or more constraints have not been satisfied. Deployment Assembly跟java版 ...

  3. gulp使用技巧-删除node_modules文件夹,解决目录层次太深删除报错的问题

    问题描述: 在使用gulp当中,自动生成的node_modules文件夹,因为文件目录层级太深,无法系统删除,用360粉碎工具也报错 解决方法: 使用npm中的插件rimraf,专门用于删除的模块插件 ...

  4. 解决 linux下编译make文件报错“/bin/bash^M: 坏的解释器:没有那个文件或目录” 问题

    PS背景:我在公司做sdk 的pc端开发,所以经常会在win下编译通过之后跑到linux下再运行一次已确保能支持多平台. 今儿在win下跑完一程序,然后放到linux下跑的时候,我用指令: [plai ...

  5. 解决Undefined symbols for architecture x86_64: 报错 和 ld: warning: ld: warning: ignoring file警告

    出现这种错误的情况: 用iphone5模拟器编译程序正常, 用iphone5s以上的模拟器编译出现Undefined symbols for architecture x86_64: 报错 和 ld: ...

  6. 解决alaert.builder二次调用报错的bug

    报错的代码是: The specified child already has a parent. You must call removeView() on the child's parent f ...

  7. 解决flutter的image_cropper组件引入报错问题

    在使用flutter的图片裁剪组件image_cropper,github:https://github.com/hnvn/flutter_image_cropper 根据它的要求,安卓需要在文件[A ...

  8. 一种解决Android studio 3.0 Build报错的方法

    问题背景: 最近在开始使用AndroidStudio3.0,刚好有一个开源的项目(Material-Movies),需要学习下.因为该项目比较早(2015年),而这段时间AndroidStudio和G ...

  9. [python]解决Windows下安装第三方插件报错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xcb in position 0:

    系统:win7IDE:pycharm Python版本:2.7 安装第三方插件是报错:  报错原因与编码有关,pip把下载的临时文件存放在了用户临时文件中,这个目录一般是C:\Users\用户名\Ap ...

  10. 【问题与解决】Github 上传代码报错(error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version)

    今天修改了GitHub 的代码,代码更新,想上传更新,却发现上传报错. 错误代码:error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 al ...

随机推荐

  1. 1、从DeepSeek API调用到Semantic Kernel集成:深度解析聊天机器人开发全链路

    引言:AI时代下的聊天机器人开发范式演进 在生成式AI技术爆发的当下,基于大语言模型(LLM)的聊天机器人开发已形成标准化技术链路.本文将结合DeepSeek API与微软Semantic Kerne ...

  2. ActiViz 在 .NET 环境下的 CT 图像渲染

    1. 什么是 ActiViz? ActiViz 是 VTK(Visualization Toolkit) 的 .NET 封装,提供了强大的 3D 计算机图形渲染功能,广泛应用于 医学影像(CT.MRI ...

  3. CentOS7安装图形界面模式

    0.9272019.03.24 15:17:05字数 865阅读 22,115 本人通过VMware14安装Centos7.6过程中出现蓝屏现象,最后发现是因为在系统安装图形界面过程中报错导致,所以决 ...

  4. BUUCTF---Cipher1(playfair)

    playfair Playfair密码原理以及该题解题步骤 Playfair密码(Playfair cipher 或 Playfair square)一种替换密码,1854年由查尔斯·惠斯通(Char ...

  5. 『Plotly实战指南』--饼图绘制基础篇

    在数据可视化的世界里,饼图是一种直观且广泛使用的图表类型. 它能够将数据各个部分占整体的比例关系清晰地展现出来,适用于诸如市场占有率分析.调查结果分布.预算分配等多个领域. 饼图以扇形面积比例直观展示 ...

  6. Kubernetes基础教程-通过部署Nginx快速学习基本使用命令

    1.验证节点信息 1.1.查看控制平面组件的状态 [root@linux-servertwo software]# kubectl get cs Warning: v1 ComponentStatus ...

  7. 谷歌SRE的7条原则

    谷歌SRE的7条原则 拥抱合理的风险 最大化系统的稳定性不仅毫无意义,而且会适得其反.不切实际的可靠性目标限制了新功能交付给用户的速度,而且用户通常不会注意到极端的可用性(比如99.99999%),因 ...

  8. WCHNET_SocketSend返回0x11原因及解决方法

    问题描述: TCPCLIENT模式使用WCHNET_SocketSend发送有概率会返回0x11 按wchnet.h定义为内存溢出错误. 异常分析: 通过WCHNET_QueryUnack查看,发现异 ...

  9. 使用PyMuPDF对pdf文件插入文字时 遇到配置本地的字体文件缺仍然使用默认Helvetica字体问题

    背景 昨天收到的新需求,一份文件从其他部门发起,进行一些文字填写后盖章,再到我们部门,我们接收到的是pdf文件,所以需要在pdf文件中进行修改,插入当日日期等文字.但有要求字体必须和原文档字体相同. ...

  10. Vue3 中的5种常见的组件传值方式,Vue3事件总线(无需插件)

    Vue3 中常见的组件传值方式: Props:这是 Vue 中最常见的组件传值方式,即在父组件中定义 prop 并将数据传递给子组件. Event Bus:可以通过事件总线在两个组件之间进行通信,即定 ...