【问题标题】:How to compress a file before saving on the disk?如何在保存到磁盘之前压缩文件?
【发布时间】:2012-01-31 08:13:43
【问题描述】:

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

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

【问题讨论】:

  • 你想保存没有名字的文件吗?
  • 不能把文件存盘再压缩再保存,把未压缩的版本删掉吗?还有你指的是哪个 MSDN 示例?

标签: c# c#-4.0


【解决方案1】:

最简单的方法是以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
  }
}

【讨论】:

  • @NIleshLanke 然后使用 GZipStreamCompressionMode.Decompress 选项
  • DeflateStream 和 GZipStream 类最适合用于未压缩的数据源。如果源数据已经被压缩,使用这些类实际上可能会增加流的大小。 docs.microsoft.com/en-us/dotnet/api/…
【解决方案2】:

说明

您不仅可以将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

更多信息

【讨论】:

    【解决方案3】:

    你不能使用 GZipStream 类吗?它是基于流的,因此您不需要磁盘文件即可使用此类。

    您要压缩哪种数据?

    【讨论】:

      【解决方案4】:

      使用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();
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 2018-07-06
        相关资源
        最近更新 更多