我使用.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的具体情况不能去)。
UseLegacyPathHandling = false
选择权 在 App.Config
或 Switch.System.IO.UseLegacyPathHandling = false; Switch.System.IO.BlockLongPaths = false
<ws2:longPathAware>true</ws2:longPathAware>
\\?\
在路径上 (据我了解,对于新版本的框架)也许有人面临这样的问题。我将很高兴任何建议。谢谢。
如果你的路径太长,你也没办法。即使你能把Windows的限制再往前移一步,在这种情况下,你的应用程序在非临时配置的系统上也不能很好地工作。
你可以把你要处理的文件复制到一个临时文件夹中,比如C:/temp,然后从那里把文件添加到存档中。
你甚至可以用只有1到2个字母组成的目录名来模仿同样的文件夹树结构,然后将完整的(但真的很短)目录路径映射到原始路径的某个地方(例如在一个文件上),这样你就可以在以后用同样的名字重建原始的文件夹树结构。