2

我有大量未正确压缩的旧版拉链。

文件保存在 zip 中,因此它们是文件夹\文件名而不是文件夹/文件名。

这意味着这样的代码:

using (ZipFile zipFile = new ZipFile(@"zippath.zip"))
{ 
     for (int i = 0; i < zipFile.Count; i++)
     {
          var entry = zipFile[i];
          zipFile.BeginUpdate();
          zipFile.Delete(entry);
          zipFile.CommitUpdate();

...

正在扔一个

找不到要删除的条目

这是在这里发现的一个已知问题,但不幸的是,我无法控制拉链的制作方式,而且我需要使用多年的 zip 文件。有没有办法在使用之前修复删除语句或修复(在 C# 中)zip 文件?

谢谢!

4

2 回答 2

2

ZipEntry 内部有一个公共函数可以为您清除名称。“ZipEntry.CleanName(你的字符串)”。当您同时添加条目并尝试删除它时进行此调用。注意:如果您将其用于文件路径,即使 CleanName 函数将“\”替换为“/”,它也会正确解释 zip 文件中的路径

**

添加 ZIPENTRY

**

zipEntryKey = file.FullName.Replace(file.Directory.Root.ToString(), string.Empty);
zipEntryKey = ZipEntry.CleanName(zipEntryKey);
ZipEntry entry = new ZipEntry(zipEntryKey);
entry.DateTime = file.LastWriteTime;


Stream fileStream = Minify(file);
byte[] buffer = new byte[fileStream.Length];
entry.Size = fileStream.Length;
fileStream.Read(buffer, 0, buffer.Length);
fileStream.Close();

zipStream.PutNextEntry(entry);
zipStream.Write(buffer, 0, buffer.Length);
zipStream.CloseEntry();

删除 ZIPENTRY

zipEntryKey = file.FullName.Replace(file.Directory.Root.ToString(), string.Empty);
zipEntryKey = ZipEntry.CleanName(zipEntryKey);

if (existingZip.FindEntry(zipEntryKey, true) > -1)
{
    existingZip.BeginUpdate();
    ZipEntry Existing = existingZip[existingZip.FindEntry(zipEntryKey, true)];
    existingZip.Delete(Existing);
    existingZip.CommitUpdate();
}
于 2012-02-16T21:15:24.963 回答
0

看来该修复程序位于您自己的链接的底部。其中一位开发人员写了一篇文章,其中包含一些代码,只是将\字符替换为/. 试试看,也许你可以从那里删除 zip 条目。

于 2011-03-14T21:51:45.857 回答