【问题标题】:When I try to add a folder to the archive get an error: the path is too long当我尝试将文件夹添加到存档时出现错误:路径太长
【发布时间】: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.ConfigSwitch.System.IO.UseLegacyPathHandling = false; Switch.System.IO.BlockLongPaths = false 中设置UseLegacyPathHandling = false option
  • 提到组策略并包含选项配置>管理模板>系统>文件系统>Enable NTFS long paths,或通过清单&lt;ws2:longPathAware&gt;true&lt;/ws2:longPathAware&gt;启用该选项
  • 使用前缀\\?\In the path(我理解为新版Framework)
  • 使用GetShortPathName函数将路径转换为8.3格式的文件....(错误仍然存​​在)

也许有人遇到过这样的问题。我很乐意接受任何建议。谢谢。

【问题讨论】:

  • 您是否尝试过使用少于 248 个字符的路径?
  • @JayGould 是的。工作正常。
  • 对不起,我在讽刺。如果您的目录超过 248 个字符,则无法解决,您需要一个不超过限制的目录。
  • 我无法更改目录。我尝试添加到存档用户文件夹。可以有任何目录结构。那是复制到临时文件夹的地方。但是,数据可能是几千兆字节
  • 好吧,你基本上有两种选择——一种是自己迭代文件夹结构并手动构建目录,而不是依赖ZipFile.AddDirectory,另一种是找到不同的 zip 库(你可以试试一个包含在 .NET 中)。遗憾的是,许多应用程序仍然不支持长路径,因此许多基础架构必须非常保守。

标签: c# .net dotnetzip


【解决方案1】:

如果您的路径太长,您将无能为力。即使您可以将 Windows 限制更进一步,您的应用程序在这种情况下也无法在非临时配置的系统上正常运行。

您可以解决方法将必须使用的文件复制到临时文件夹(如 C:\temp),然后从那里将文件添加到存档中。

您甚至可以使用仅由 1 或 2 个字母组成的目录名称来模拟相同的文件夹树结构,然后将完整(但实际上更短)的目录路径映射到某处(例如文件上)的原始路径,以便您以后可以重建原来的同名文件夹树结构。

【讨论】:

  • 是的,我想将其保存为文件夹结构,以便进一步恢复数据。
猜你喜欢
  • 1970-01-01
  • 2012-09-22
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
相关资源
最近更新 更多