当我尝试添加一个文件夹到存档时,得到一个错误:路径太长。

问题描述 投票:1回答:1

我使用.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个字符。

我找到了很多解决方法,但到了工作岗位上又不行了(因为应用到新版本Framework'a的具体情况不能去)。

  • 使用框架4.6.2。设置 UseLegacyPathHandling = false 选择权App.ConfigSwitch.System.IO.UseLegacyPathHandling = false; Switch.System.IO.BlockLongPaths = false
  • 随着组策略的提及,并包含选项Configuration>Administrative Templates>System>Filesystem&gt。启用NTFS长路径或通过清单启用该选项。<ws2:longPathAware>true</ws2:longPathAware>
  • 使用前缀 \\?\ 在路径上 (据我了解,对于新版本的框架)
  • 使用以下方法将路径转换为8.3格式的文件。GetShortPathName 功能......。(错误依然存在)

也许有人面临这样的问题。我将很高兴任何建议。谢谢。

c# .net dotnetzip
1个回答
2
投票

如果你的路径太长,你也没办法。即使你能把Windows的限制再往前移一步,在这种情况下,你的应用程序在非临时配置的系统上也不能很好地工作。

你可以把你要处理的文件复制到一个临时文件夹中,比如C:/temp,然后从那里把文件添加到存档中。

你甚至可以用只有1到2个字母组成的目录名来模仿同样的文件夹树结构,然后将完整的(但真的很短)目录路径映射到原始路径的某个地方(例如在一个文件上),这样你就可以在以后用同样的名字重建原始的文件夹树结构。

© www.soinside.com 2019 - 2024. All rights reserved.