簡體   English   中英

使用 io.compression 壓縮大文件時出現內存不足異常

[英]out of memory exception in compress large files using io.compression

我試圖不超過內存最大大小,所以我必須每次檢查它是否大於最大內存大小然后我將它刷新到 zip 文件 Stream 中。 問題在這里它用文件流中存在的內存流替換內存流,或者有什么方法可以用另一種方式來做同樣的事情(但不使用任何DLL庫)

MemoryStream memoryStream = new MemoryStream();
   FileStream fileStream = new FileStream(sbZipFolderName.ToString(),FileMode.Create);
   foreach (FileInfo flInfo in ListfileFolderPaths)
    {
      using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Update, true))          
      archive.CreateEntryFromFile(flInfo.FullName, slastFolderName + "/" + flInfo.DirectoryName.Replace(new DirectoryInfo(sFolderPath.ToString()).FullName, "") + "/" + flInfo.Name);
      if (memoryStream.Length > MaxSize)
      {
    using (fileStream = new FileStream(sFolderPath + "/" + slastFolderName + ".zip",     FileMode.Create))
         {
             memoryStream.Seek(0, SeekOrigin.Begin);
             memoryStream.CopyTo(fileStream);
             memoryStream = new MemoryStream();

           }
      }
   }
   if ((memoryStream != null) && (memoryStream.Length > 0))
      memoryStream.CopyTo(fileStream);

您可以使用Gzip存檔來壓縮文件。

這是壓縮:

public static byte[] Compress(byte[] raw)
{
using (MemoryStream memory = new MemoryStream())
{
    using (GZipStream gzip = new GZipStream(memory,
    CompressionMode.Compress, true))
    {
    gzip.Write(raw, 0, raw.Length);
    }
    return memory.ToArray();
   }
  }
}

這是解壓:

 static byte[] Decompress(byte[] gzip)
{
// Create a GZIP stream with decompression mode.
// ... Then create a buffer and write into while reading from the GZIP stream.
using (GZipStream stream = new GZipStream(new MemoryStream(gzip), CompressionMode.Decompress))
{
    const int size = 4096;
    byte[] buffer = new byte[size];
    using (MemoryStream memory = new MemoryStream())
    {
    int count = 0;
    do
    {
        count = stream.Read(buffer, 0, size);
        if (count > 0)
        {
        memory.Write(buffer, 0, count);
        }
    }
    while (count > 0);
    return memory.ToArray();
    }
}
}

}

告訴我它是否有效。

祝你好運。

暫無
暫無

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

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