c# - 使用前缀 \\?\ 压缩长文件会导致 zip 存档无效
问题描述
我正在尝试压缩很长的文件。我读过其他帖子,指出您应该在长文件名前加上 '\\?\' 才能使其正常工作。这当然可以让压缩过程正确完成。但是,在解压缩文件时,我收到错误“无效文件 \\?\myfile.txt”。这意味着它实际上是使用预先添加的长文件名指示符压缩我的文件。可以用长文件名进行压缩吗?
using (ZipArchive zip = ZipFile.Open(zipfinalpath, ZipArchiveMode.Create))
{
for (int i = 0; i < fullfilepaths.Count; i++)
{
zip.CreateEntryFromFile(fullfilepaths[i], zipfilepaths[i]);
}
}
解决方案
Windows 文件名中的最大字符数限制为260 个字符。在 .NET 4.6.2 及更高版本中,PathTooLong
不再引发异常。所以你的代码工作正常。在这里阅读更多。
在 4.6.2 中,如果我们看到 >= MAX_PATH 的路径,我们将不再抛出 PathTooLongException。如果操作系统不喜欢它,我们将显示操作系统返回的任何错误(可能是 PathTooLong),但我们不会再猜测操作系统会做什么。
在本地组策略编辑器中,您可以“启用 Win32 长路径”,然后它就不会被截断。
编写了一个库来克服这些问题。请参阅Delimon.Win32.IO 库。
根据图书馆信息:
该库是专门为克服 .NET Framework 使用长路径和文件名的限制而编写的。使用此库,您可以以编程方式浏览、访问、写入、删除等 System.IO 命名空间无法访问的文件和文件夹。Delimon.Win32.IO 取代了 System.IO 的基本文件功能,并支持最多32,767个 字符的文件和文件夹名称。这个库是在 .NET Framework 4.0 上编写的,可以在 x86 和 x64 系统上使用。
推荐阅读
- sublimetext3 - 我以前从来没有保存过崇高的文字,今天如果想获得输出,我将不得不保存
- linux - 使用 curl 上传文件并打印 curl 输出时获取 http 代码
- deep-learning - 卷积神经网络输出通道的困惑
- flutter - Flutter:无法测试从未布置过的渲染框
- javascript - 解释函数结果
- opencv - 使用 gocv 捕获视频时如何避免延时
- javascript - 使用自定义文本输入时如何更改文本输入的焦点
- spacy - Spacy [E047] 无法为未注册的扩展属性“trf_data”赋值
- c# - 显示(恢复窗口)应用程序,而不是在 Windows 窗体中打开其他实例
- angular - 在 canActivate 中进行延迟,直到获取 IP 地址数据