当我尝试向归档添加文件夹时出错:路径太长

时间:2016-08-12 07:44:14

标签: c# .net dotnetzip

我使用.Net Framework 4.0; VS 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个字符。

我找到了很多解决方案,但是要开始工作并且不起作用(因为应用程序对新版本框架的具体细节&#39; a不能去)。

  • 使用Framework 4.6.2。在UseLegacyPathHandling = falseApp.Config
  • 中设置Switch.System.IO.UseLegacyPathHandling = false; Switch.System.IO.BlockLongPaths = false option
  • 提及组策略并包含选项配置&gt;管理模板&gt;系统&gt;文件系统&GT; Enable NTFS long paths,或通过清单<ws2:longPathAware>true</ws2:longPathAware>
  • 启用该选项
  • 使用前缀\\?\ In the path(我理解为新版本的框架)
  • 使用GetShortPathName函数将路径转换为8.3格式的文件....(错误仍然存​​在)

也许有人遇到这样的问题。我会很高兴任何建议。感谢。

2 个答案:

答案 0 :(得分:1)

如果你的路径太长,你就无法做到这一点。即使您可以进一步移动Windows限制,您的应用程序也无法在该场景中的非临时配置系统上正常运行。

您可以将您必须使用的文件复制到C:\ temp等临时文件夹,并将文件从那里添加到存档中。

您甚至可以模仿相同的文件夹树结构,目录名称只包含1或2个字母,然后将完整(但确实更短)的目录路径映射到原始路径(例如文件),以便您可以稍后重建具有相同名称的原始文件夹树结构。

答案 1 :(得分:0)

也许这个答案可以帮助https://stackoverflow.com/a/1880480/3061797

  

这并不严格,因为NTFS文件系统支持最多32k字符的路径。你可以使用win32 api和&#34; \?\&#34;将路径前缀设置为使用超过260个字符。

     

来自.Net BCL团队博客的详细解释。   一个小的摘录突出了长路径的问题