使用 MemoryStream 建立 ZIP 檔案
在 .NET 中處理資料的一個有趣的方面是能夠在記憶體中操作資料。在這種情況下,通常使用 MemoryStream 物件來儲存數據,模仿磁碟上檔案的行為。但是,在建立 ZIP 檔案時,似乎存在與使用 MemoryStream 相關的警告。
考慮以下場景:嘗試使用 MemoryStream 建立 ZIP 檔案以及隨後對文字的寫入作業檔案中的檔案會導致存檔檔案不完整,文字檔案明顯缺失。但是,如果直接使用FileStream,則存檔建立成功。這種差異引發了一個問題:是否可以使用 MemoryStream 來建立 ZIP 檔案並避免使用 FileStream 方法。
答案在於理解用於存檔建立的 ZipArchive 類別的複雜性。事實證明,ZipArchive 建構函數有一個附加參數,leaveOpen,預設為 false。將此參數設為 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!"); } } memoryStream.Seek(0, SeekOrigin.Begin); using (var fileStream = new FileStream("C:\Temp\test.zip", FileMode.Create)) { memoryStream.CopyTo(fileStream); } }
在這段修改後的程式碼中,將leaveOpen設定為true允許檔案保持開啟狀態,隨後的Seek操作確保記憶體中的存檔已準備好作為完整的ZIP寫入檔案流檔案。此方法解決了使用 MemoryStream 時存檔中檔案遺失的問題。
以上是我可以在 .NET 中使用 MemoryStream 而不使用 FileStream 建立 ZIP 存檔嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!