如何在保存到磁盘之前压缩文件?

时间:2012-01-31 08:13:43

标签: c# c#-4.0

我想在物理保存到磁盘之前压缩文件。

我尝试使用压缩和解压缩方法(MSDN示例代码),但所有方法都需要一个已经物理存储在磁盘上的文件。

4 个答案:

答案 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)

使用MemoryStreamGZipStream

文件是一个字节数组,因此您可以根据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();
            }
        }
    }
}