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

7

我想在将文件物理保存到磁盘之前对其进行压缩。

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


你想要保存没有名称的文件吗? - theWalker
你不能将文件保存在磁盘上并压缩它,然后再保存一次并删除未压缩的版本吗?另外,你指的是哪个MSDN示例? - Amar Palsapure
4个回答

8
最简单的方法是将文件作为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
  }
}

2
@NIleshLanke 然后使用 GZipStreamCompressionMode.Decompress 选项。 - JaredPar
DeflateStream和GZipStream类最适用于未压缩的数据源。如果源数据已经压缩,使用这些类可能会增加流的大小。https://learn.microsoft.com/en-us/dotnet/api/system.io.compression.gzipstream?view=netframework-4.8 - Zimba

4

描述

你不仅可以使用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

更多信息


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

0

你不能使用GZipStream类吗?它是基于流的,所以你不需要一个磁盘文件来使用这个类。

你想要压缩哪种类型的数据?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接