我想在物理保存到磁盘之前压缩文件。
我尝试使用压缩和解压缩方法(MSDN示例代码),但所有方法都需要一个已经物理存储在磁盘上的文件。
答案 0 :(得分:7)
最简单的方法是将文件作为Stream
打开,并使用压缩API(如GZipStream
)进行包装。
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
}
}
答案 1 :(得分:4)
您不仅可以将GZipStream
类用于fileName。可以压缩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
答案 2 :(得分:0)
你不能使用GZipStream类吗?它是基于流的,因此您不需要磁盘文件来使用此类。
您尝试压缩哪种数据?
答案 3 :(得分:0)
使用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();
}
}
}
}