如何压缩大文件C#

时间:2018-01-10 16:35:29

标签: c# compression

我正在使用这种方法压缩文件,它工作得很好,直到我找到一个2.4 GB的文件然后它给我一个溢出错误:

 void CompressThis (string inFile, string compressedFileName)
 {

        FileStream sourceFile = File.OpenRead(inFile);
        FileStream destinationFile = File.Create(compressedFileName);


        byte[] buffer = new byte[sourceFile.Length];
        sourceFile.Read(buffer, 0, buffer.Length);

        using (GZipStream output = new GZipStream(destinationFile,
            CompressionMode.Compress))
        {
            output.Write(buffer, 0, buffer.Length);
        }

        // Close the files.
        sourceFile.Close();
        destinationFile.Close();
  }

如何压缩大文件?

3 个答案:

答案 0 :(得分:4)

您正试图将所有这些内容分配到内存中。这不是必需的,您可以将输入流直接输入到输出流中。

答案 1 :(得分:4)

您不应该将整个文件写入内存。请改用Stream.CopyTo。此方法从当前流中读取字节,并使用指定的缓冲区大小(默认为81920字节)将它们写入另一个流。

如果使用Stream关键字,您也无需关闭using个对象。

void CompressThis (string inFile, string compressedFileName)
{
    using (FileStream sourceFile = File.OpenRead(inFile))
    using (FileStream destinationFile = File.Create(compressedFileName))
    using (GZipStream output = new GZipStream(destinationFile, CompressionMode.Compress))
    {
        sourceFile.CopyTo(output);
    }
}

您可以在MSDN上找到更完整的示例。

答案 2 :(得分:1)

zip 格式的替代解决方案,无需分配内存 -

using (var sourceFileStream = new FileStream(this.GetFilePath(sourceFileName), FileMode.Open))
            {
                using (var destinationStream =
                    new FileStream(this.GetFilePath(zipFileName), FileMode.Create, FileAccess.ReadWrite))
                {
                    using (var archive = new ZipArchive(destinationStream, ZipArchiveMode.Create, true))
                    {
                        var file = archive.CreateEntry(sourceFileName, CompressionLevel.Optimal);
                        using (var entryStream = file.Open())
                        {
                            var fileStream = sourceFileStream;
                            await fileStream.CopyTo(entryStream);
                        }
                    }
                }
            }

解决方案是直接从输入流写入到输出流