我正在使用DotNetZip库重命名 zip 存档中的文件。
这是我正在使用的代码:
void RenameFile(string existingArchive, string oldName, string newName)
{
using (ZipFile zip = ZipFile.Read(existingArchive))
{
ZipEntry targetFile = zip.Entries.FirstOrDefault(f =>
f.FileName.ToLower() == oldName.ToLower());
//targetFile is not null.
targetFile.FileName = newName;
zip.Save();
}
}
我遇到的问题是重命名操作后,zip 已损坏。当我使用 WinRAR 浏览它时,我重命名的文件有一个重复的条目(两个条目都是相同的,具有新名称)。当我尝试提取它时,WinRAR 在两个相同的条目上抛出一个 CRC 错误。
我试过保存到不同的文件名,但没有运气。
我正在使用库的 v1.9.1.8(精简版)。
更新:
重命名后删除其中一个重复条目似乎有效并且没有明显的副作用。尽管如此,一个不那么老套的方法还是受欢迎的。
void RenameFile(string existingArchive, string oldName, string newName)
{
using (ZipFile zip = ZipFile.Read(existingArchive))
{
ZipEntry targetFile = zip.Entries.FirstOrDefault(f =>
f.FileName.ToLower() == oldName.ToLower());
//targetFile is not null.
targetFile.FileName = newName;
//if the file was duplicated, remove one of the duplicates:
var dupFiles = zip.Where(f => f.FileName == newName).ToList();
if (dupFiles.Count > 1)
{
zip.RemoveEntries(dupFiles.Skip(1).ToList());
}
zip.Save();
}
}
更新 2:
由于答案表明源文件可能是问题所在,我在这里上传了一个示例 zip 文件(24kb)
这是我用来验证它是否存在此问题的代码:
using (ZipFile zip = ZipFile.Read("test.zip"))
{
ZipEntry entry = zip.Entries.FirstOrDefault(e => Path.GetFileName(e.FileName) == "test.max");
entry.FileName = Path.Combine(Path.GetDirectoryName(entry.FileName), "newname.max");
zip.Save(@"test2.zip");
}