【发布时间】:2016-08-12 07:44:14
【问题描述】:
我使用 .Net Framework 4.0;与 2015 年相比; Ionic.Zip.Reduced (DotNetZip.Reduced) v1.9.1.8。当我尝试将文件夹添加到存档时,文本出现异常:
路径太长了
示例代码:
using (var zipFile = new ZipFile(zipFilePath))
{
zipFile.UseZip64WhenSaving = Zip64Option.AsNecessary;
zipFile.AlternateEncodingUsage = ZipOption.Always;
zipFile.AlternateEncoding = Encoding.UTF8;
zipFile.ParallelDeflateThreshold = -1;
var dirPath = @"C:\AAAAAAAAAAA\AAAAAA\AAAAAAAAAAAAAAA\AAAAAAAAA\AAAAAAAAAAAAA\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\";
zipFile.AddDirectory(dirPath); <-Exception
zipFile.Save();
}
文件夹中有一个文件名为:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.zip
由于错误:
路径太长了
重写在基于文件的添加到存档中(使用相对路径):
using (var zipFile = new ZipFile(zipFilePath))
{
zipFile.UseZip64WhenSaving = Zip64Option.AsNecessary;
zipFile.AlternateEncodingUsage = ZipOption.Always;
zipFile.AlternateEncoding = Encoding.UTF8;
zipFile.ParallelDeflateThreshold = -1;
var dirPath = @"C:\AAAAAAAAAAA\AAAAAA\AAAAAAAAAAAAAAA\AAAAAAAAA\AAAAAAAAAAAAA\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\";
Directory.SetCurrentDirectory(dirPath);
var files = Directory.GetFiles(dirPath, "*", SearchOption.AllDirectories).ToArray();
foreach (var fullFilePath in files)
{
var fileName = Path.GetFileName(fullFilePath);
var relatedPath = fullFilePath.Substring(0, fullFilePath.LastIndexOf(fileName, StringComparison.InvariantCultureIgnoreCase)).Replace(zipDir, "");
var relatedFilePath = Path.Combine(relatedPath, fileName);
zipFile.AddFile(relatedFilePath); <-Exception
}
zipFile.Save();
}
错误是一样的:
路径太长了
我尝试调用Path.GetDirectoryName()方法,但同样返回错误:
指定的路径、文件名或两者都太长。完全 限定文件名必须少于 260 个字符,并且 目录名称必须少于 248 个字符。
我找到了很多解决办法但是去上班都不管用(因为具体的应用到新版本Framework'a上去不了)。
- 使用框架 4.6.2。在
App.Config或Switch.System.IO.UseLegacyPathHandling = false; Switch.System.IO.BlockLongPaths = false中设置UseLegacyPathHandling = falseoption - 提到组策略并包含选项配置>管理模板>系统>文件系统>Enable NTFS long paths,或通过清单
<ws2:longPathAware>true</ws2:longPathAware>启用该选项 - 使用前缀
\\?\In the path(我理解为新版Framework) - 使用GetShortPathName函数将路径转换为8.3格式的文件....(错误仍然存在)
也许有人遇到过这样的问题。我很乐意接受任何建议。谢谢。
【问题讨论】:
-
您是否尝试过使用少于 248 个字符的路径?
-
@JayGould 是的。工作正常。
-
对不起,我在讽刺。如果您的目录超过 248 个字符,则无法解决,您需要一个不超过限制的目录。
-
我无法更改目录。我尝试添加到存档用户文件夹。可以有任何目录结构。那是复制到临时文件夹的地方。但是,数据可能是几千兆字节
-
好吧,你基本上有两种选择——一种是自己迭代文件夹结构并手动构建目录,而不是依赖
ZipFile.AddDirectory,另一种是找到不同的 zip 库(你可以试试一个包含在 .NET 中)。遗憾的是,许多应用程序仍然不支持长路径,因此许多基础架构必须非常保守。