簡體   English   中英

從一個流中下載文件,然后將其保存為zip格式,而無需將所有數據存儲在內存中

[英]Download file from one stream and save it to zip in another stream without putting all data in memory

我是處理流或諸如此類的完整的初學者,因此,如果您發現任何明顯錯誤的地方,這就是原因。 我有一些文件存儲在天藍色。 我需要提取文件,將其壓縮,然后返回壓縮文件。

我已經用1GB的文件進行了測試,盡管它可以工作,但最終使用2.5GB的內存。 在最后一行開始和完成之間,內存使用量會激增。 我不確定為什么要在內存中加載所有內容,因此我不確定應該采取什么措施來防止這種情況的發生。 正確的方法是什么? 我唯一想到的就是在某處指定緩沖區大小,但是我見過的所有可能的地方都有一個很小的默認值。

FileStream zipToOpen = new FileStream("test.zip", FileMode.Create);
ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update, true);
ZipArchiveEntry zipEntry = archive.CreateEntry("entryName", CompressionLevel.Optimal);

// ... some azure code
file = await dir.GetFileReference(fileName);
fileContents = await file.OpenReadAsync().ConfigureAwait(false);

await fileContents.CopyToAsync(zipEntry.Open()).ConfigureAwait(false);

只需將存檔創建為

ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create);

您的內存消耗將降至最低(在我的測試案例中,它從900M降至36M)...

似乎問題與ZipArchiveMode.Update有關

void Zip(IEnumerable<string> files, Stream inputStream)
{
    using (var zip = new System.IO.Compression.ZipArchive(inputStream, System.IO.Compression.ZipArchiveMode.Create))
    {
        foreach (var file in files.Select(f => new FileInfo(f)))
        {
            var entry = zip.CreateEntry(file.Name, System.IO.Compression.CompressionLevel.Fastest);
            using (var s = entry.Open())
            {
                using (var f = File.Open(file.FullName, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    f.CopyTo(s);
                }
            }
        }
    }
}

暫無
暫無

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

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