C# 压缩文件 GZipStream

// 官方文档: https://learn.microsoft.com/zh-cn/dotnet/api/system.io.compression.gzipstream?view=net-8.0
/* GZipStream介绍
 * 此类表示 gzip 数据格式,该格式使用行业标准算法进行无损文件压缩和解压缩。 格式包括用于检测数据损坏的循环冗余检查值。 gzip 数据格式使用与 类相同的算法 DeflateStream ,但可以扩展为使用其他压缩格式。 该格式可以采用专利未涵盖的方式轻松实现。
 * 从 .NET Framework 4.5 开始,DeflateStream类使用 zlib 库进行压缩。 因此,它提供更好的压缩算法,在大多数情况下,压缩文件比.NET Framework的早期版本更小。
 * GZipStream写入扩展名为 .gz 的文件的压缩对象可以使用许多常用的压缩工具进行解压缩; 但是,此类本质上不提供向 zip 存档添加文件或从 zip 存档中提取文件的功能。
 * 和 GZipStream 中的DeflateStream压缩功能以流的形式公开。 数据是逐字节读取的,因此无法执行多次传递来确定压缩整个文件或大型数据块的最佳方法。 DeflateStream和 GZipStream 类最适合用于未压缩的数据源。 如果源数据已压缩,则使用这些类实际上可能会增加流的大小。
*/


using System.IO.Compression;
using System.IO;
using System.Text;
using System;
using System.Diagnostics;

namespace ConsoleApp_Compress
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // Compress_Unzip1();
            call_external();
        }

        static void Compress_Gzip() 
        {
            // 设置路径
            string path = "d:/zip.gz";

            // 将string转换为byte[]
            string MaxText="";
            foreach (var x in File.ReadLines("d:/1.txt")) { MaxText += x;  }
            byte[] bytes = new UTF8Encoding(true).GetBytes(MaxText);



            using (FileStream Fzip = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                // 该构造方法需要从流读取数据, 结束即压缩成功. 最后释放资源.
                using (GZipStream Zip = new GZipStream(Fzip, CompressionMode.Compress))
                {
                    Zip.Write(bytes, 0, bytes.Length); 
                    Zip.Flush();
                    Zip.Close();
                }
            }
        }

        static void Compress_Unzip() 
        {
            
            string path = "d:/zip.gz";
            FileInfo fileInfo = new FileInfo(path);
            byte[] bytes = new byte[fileInfo.Length];
            char[] cahrs = new char[fileInfo.Length];
            using (FileStream Fzip = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                // 从流读取数据, 读取完后,最后释放资源.
                using (GZipStream Zip = new GZipStream(Fzip, CompressionMode.Decompress))
                {
                    Zip.Read(bytes, 0, bytes.Length);
                    Zip.Flush();
                    Zip.Close();
                }

                // 真麻烦
                Decoder decoder = Encoding.UTF8.GetDecoder();       // 将以编码的数据 设定指定编码格式
                decoder.GetChars(bytes, 0, bytes.Length, cahrs, 0); // byte转换为char
                Console.WriteLine(cahrs);
                Console.ReadKey();
            }

        }


        static void Compress_Unzip1() // Compress_Unzip 相同结果的方式, 使用StreamReader来读取流的数据;
        {
            string path = "d:/zip.gz";
            using (FileStream Fzip = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                using (GZipStream UnZip = new GZipStream(Fzip, CompressionMode.Decompress))
                {
                    using (StreamReader reader = new StreamReader(UnZip)) 
                    {
                        string line = reader.ReadToEnd();
                        Console.WriteLine(line);
                    }
                }

                Console.ReadKey();

                // 其实还有很多压缩的文件方式, 但是我觉得还是其他的压缩软件来操作, 因为那都是封装的方法, 直接调用就可以使用, 更为方便.
            }

        }

        // 如果使用外部的7zip程序来处理压缩文件不是更为方便吗, 只需要调用7zip程序的命令即可使用
        static void call_external()  // 需要在根目录添加7z程序才可以调用程序
        {
            string path = "d:/Themes.zip";
            Process.Start("./7z/7za.exe", $" l {path}");  // 调用外部程序, 查看压缩文件.
        }
    }
}

 

posted @ 2024-03-24 08:29  edolf  阅读(189)  评论(0编辑  收藏  举报