3

私は最近少し問題を抱えています。1 つの zip ファイルをメモリ ストリームに抽出し、そのストリームからupdateEntry()メソッドを使用して宛先 zip ファイルに追加しようとしました。

問題は、ストリーム内のファイルが宛先の zip に入れられているときに、ファイルがまだ zip にない場合に機能することです。同名のファイルが存在する場合、正しく上書きされません。dotnetzip のドキュメントには、この方法は zip に存在する同じ名前のファイルを上書きすると書かれていますが、機能していないようです。正しく書き込みますが、zip を確認すると、上書きされるはずのファイルの圧縮バイト サイズが 0 で、何か問題が発生したことを意味します。

私が何をしているのかを示すために、以下にコードを添付します。

ZipFile zipnew = new ZipFile(forgeFile);
ZipFile zipold = new ZipFile(zFile);

using(zipnew) {
    foreach(ZipEntry zenew in zipnew) {
        percent = (current / zipnew.Count) * 100;
        string flna = zenew.FileName;
        var fstream = new MemoryStream();

        zenew.Extract(fstream);
        fstream.Seek(0, SeekOrigin.Begin);

        using(zipold) {
            var zn = zipold.UpdateEntry(flna, fstream);
            zipold.Save();
            fstream.Dispose();
        }
        current++;
    }
    zipnew.Dispose();
}
4

1 に答える 1

4

少し遅いかもしれませんが、ファイルを手動で削除して追加することで解決策を見つけました。他の誰かがこの問題に遭遇した場合に備えて、ここにコードを残しておきます。

ZipFile zipnew = new ZipFile(forgeFile);
ZipFile zipold = new ZipFile(zFile);

using(zipnew) {
    // Loop through each entry in the zip file
    foreach(ZipEntry zenew in zipnew) {
        string flna = zenew.FileName;

        // Create a new memory stream for extracted files
        var ms = new MemoryStream();


        // Extract entry into the memory stream
        zenew.Extract(ms);
        ms.Seek(0, SeekOrigin.Begin); // Rewind the memory stream

        using(zipold) {
            // Remove existing entry first
            try {
                zipold.RemoveEntry(flna);
                zipold.Save();
            }
            catch (System.Exception ex) {} // Ignore if there is nothing found

            // Add in the new entry
            var zn = zipold.AddEntry(flna, ms);
            zipold.Save(); // Save the zip file with the newly added file
            ms.Dispose(); // Dispose of the stream so resources are released
        }
    }
    zipnew.Dispose(); // Close the zip file
}
于 2013-03-17T14:59:08.940 に答える