我正在使用这种方法压缩文件,它工作得很好,直到我找到一个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();
}
如何压缩大文件?
答案 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);
}
}
}
}
解决方案是直接从输入流写入到输出流