2

正しく圧縮されていないレガシーzipがたくさんあります。

ファイルはzipに保存されているため、folder/filenameではなくfolder\filenameになります。

つまり、次のようなコードです。

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の作成方法を制御できず、何年にもわたって処理する必要のあるzipファイルがあります。使用する前に、deleteステートメントを修正するか、zipファイルを(C#で)修復する方法はありますか?

ありがとう!

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

修正はあなた自身のリンクの一番下にあるようです。開発者の 1 人が、単に\文字を/. それを試してみてください。おそらくそこから zip エントリを削除できます。

于 2011-03-14T21:51:45.857 に答える