使用MemoryStream 在記憶體中建立ZIP 檔案
嘗試使用MemoryStream 在記憶體中建立ZIP 檔案時,使用者可能會遇到以下情況:存檔文件已生成,但缺少預期的內容文件。用 FileStream 取代 MemoryStream 可以解決這個問題。但是,在不借助 FileStream 的情況下利用 MemoryStream 建立 ZIP 檔案是否可行?
解決方案在於了解 ZipArchive 的內部運作原理。在存檔被視為完整之前,需要寫入某些關鍵字節(例如校驗和)。預設情況下,ZipArchive 會關閉流來執行此操作,但在 MemoryStream 的情況下,此操作會阻止後續使用流。
為了克服這個問題,可以將 ZipArchive 的第三個參數設為 true,這使得在不關閉流的情況下寫入最終位元組成為可能。以下修改後的程式碼示範了這個方法:
using (var memoryStream = new MemoryStream()) { using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { var demoFile = archive.CreateEntry("foo.txt"); using (var entryStream = demoFile.Open()) using (var streamWriter = new StreamWriter(entryStream)) { streamWriter.Write("Bar!"); } } using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create)) { memoryStream.Seek(0, SeekOrigin.Begin); memoryStream.CopyTo(fileStream); } }
透過合併此調整,使用者可以使用 MemoryStream 在記憶體中成功建立 ZIP 存檔,而不會影響存檔的完整性或完整性。
以上是我可以在不使用 FileStream 的情況下使用 MemoryStream 在記憶體中建立 ZIP 檔案嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!