我使用。net Framework 4.0;VS 2015;(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:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
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:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
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个字符。
我找到了很多的解决方案,但得到了工作,并没有工作(因为具体的应用程序到新版本框架'a不能去)。
- 使用4.6.2框架。在
App.Config
或Switch.System.IO.UseLegacyPathHandling = false; Switch.System.IO.BlockLongPaths = false
中设置 - 提到组策略并包含选项配置>管理模板>系统>文件系统>启用NTFS长路径,或通过清单
<ws2:longPathAware>true</ws2:longPathAware>
启用该选项 - 在路径中使用前缀
\?
(我理解为新版本的框架) - 使用GetShortPathName函数....将路径转换为8.3格式的文件(错误仍然)
UseLegacyPathHandling = false
选项也许有人面临这样的问题。我很乐意听取任何建议。谢谢。
如果你的路径太长,你就无能为力了。在这种情况下,即使您可以进一步移动Windows限制,您的应用程序也无法在非特别配置的系统上正常工作。
你可以把你要用的文件复制到一个临时文件夹,比如C:temp,然后从那里把文件添加到存档中。
您甚至可以用仅由1或2个字母组成的目录名模拟相同的文件夹树结构,然后将完整的(但实际上更短的)目录路径映射到某个地方的原始路径(例如在文件上),以便您可以稍后用相同的名称重建原始文件夹树结构。