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は2つの同一のエントリに対してCRCエラーをスローします。
別のファイル名で保存しようとしましたが、うまくいきませんでした。
ライブラリのv1.9.1.8(縮小版)を使用しています。
アップデート:
名前の変更後に重複するエントリの1つを削除すると機能するようで、目に見える副作用はありません。それでも、ハッキーでないアプローチは歓迎されます。
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");
}