【发布时间】:2012-01-31 08:13:43
【问题描述】:
我想在物理保存到磁盘之前压缩文件。
我尝试使用压缩和解压缩方法(MSDN 示例代码),但所有方法都需要一个已经物理存储在磁盘上的文件。
【问题讨论】:
-
你想保存没有名字的文件吗?
-
不能把文件存盘再压缩再保存,把未压缩的版本删掉吗?还有你指的是哪个 MSDN 示例?
我想在物理保存到磁盘之前压缩文件。
我尝试使用压缩和解压缩方法(MSDN 示例代码),但所有方法都需要一个已经物理存储在磁盘上的文件。
【问题讨论】:
最简单的方法是以Stream 的形式打开文件,并使用GZipStream 之类的压缩API 对其进行包装。
using (var fileStream = File.Open(theFilePath, FileMode.OpenOrCreate) {
using (var stream = new GZipStream(fileStream, CompressionMode.Compress)) {
// Write to the `stream` here and the result will be compressed
}
}
【讨论】:
GZipStream 和 CompressionMode.Decompress 选项
您不仅可以将GZipStream 类与文件名一起使用。可以压缩一个Stream。
GZipStream 类提供用于压缩和解压缩流的方法和属性。
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms,
System.IO.Compression.CompressionMode.Compress);
// now you can save the file to disc
【讨论】:
你不能使用 GZipStream 类吗?它是基于流的,因此您不需要磁盘文件即可使用此类。
您要压缩哪种数据?
【讨论】:
使用MemoryStream 和GZipStream。
文件是一个字节数组,因此您可以根据http://www.dotnetperls.com/compress尝试以下代码:
using System;
using System.IO;
using System.IO.Compression;
using System.Text;
namespace ConsoleApplication1
{
internal class Program
{
private static void Main(string[] args)
{
byte[] text = Encoding.ASCII.GetBytes(new string('X', 10000));
byte[] compress = Compress(text);
Console.WriteLine("Compressed");
foreach (var b in compress)
{
Console.WriteLine("{0} ", b);
}
Console.ReadKey();
}
public static byte[] Compress(byte[] raw)
{
using (var memory = new MemoryStream())
{
using (var gzip = new GZipStream(memory, CompressionMode.Compress, true))
{
gzip.Write(raw, 0, raw.Length);
}
return memory.ToArray();
}
}
}
}
【讨论】: