簡體   English   中英

如何分階段創建zip文件?

[英]How to create zip file in stages?

我通過以下方式將數據寫入ZIP文件:

    private static void ZipStringToFile(string value)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            using (GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Compress, true))
            {
                byte[] queryData = _encUtf8.GetBytes(value);
                compressedzipStream.Write(queryData, 0, queryData.Length);
                compressedzipStream.Write(_dataEndOfLine, 0, _dataEndOfLine.Length);
            }
            using (FileStream outfile = new FileStream("TestZip.zip", FileMode.Append))
            {
                byte[] buffer2 = new byte[ms.Length];
                ms.Seek(0, SeekOrigin.Begin);
                ms.Read(buffer2, 0, buffer2.Length);
                outfile.Write(buffer2, 0, buffer2.Length);
            }
        }
    }

效果很好。 但是,如果我再次使用相同的方法:

        ZipStringToFile("String #1");
        ZipStringToFile("\r\n");
        ZipStringToFile("String #2");

我有較大的zip文件(因此我認為文件包含兩個字符串),但是使用“ TotalCommander”嵌入式存檔程序解壓縮后,我只會看到“ String#2”。

我認為zip文件本身的結構不允許“附加”,因此我的做法主要存在錯誤。

我是否應該先將所有內容序列化為文件並最終壓縮為zip? 還是有將數據附加到zip存檔中的正確方法?

謝謝。

您使用的術語“ zip”不正確。 gzip不是zip。 gzip是單個流的壓縮數據格式。 zip是用於多個文件的存檔格式。 您正在生成gzip流。

可以合並gzip流以生成更大的有效gzip流。 兼容的gzip解碼器應從級聯流中傳遞所有數據。 因此,要么沒有正確地串聯它們,要么沒有將正確的串聯結果傳遞給“ TotalCommander”,或者“ TotalCommander”不是兼容的gzip解碼器。

我是否應該先將所有內容序列化為文件並最終壓縮為zip?

通常,是的,您應該這樣做。 原因是,如果只喂gzip小字符串,您將得到糟糕的壓縮。 為了獲得良好的壓縮效果,您需要為gzip提供更多數據以供使用。

如果您使用的是ASP.NET ZipArchive庫,我的建議是嘗試:

  1. 檢查郵政編碼是否存在
  2. 如果存在,請打開它。
  3. 使用GetEntry函數打開現有的存檔條目
  4. Open()流的條目,然后將新數據寫入流
  5. 將存檔保存回磁盤。

否則,您可能每次都覆蓋現有存檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM