C# 压缩与解压

  在System.IO.Compression命名空间下框架封装了一些对流进行压缩和解压缩的类。

使用DeflateStream类压缩文件

    Console.WriteLine("请输入待压缩文件的完整路径:");
    string inputFilePath = Console.ReadLine();
    Console.WriteLine("请输入压缩后文件的输出路径:");
    string outputFilePath = Console.ReadLine();

    using (FileStream instream = new FileStream(inputFilePath, FileMode.Open))
    using (FileStream outstream = new FileStream(outputFilePath, FileMode.Create))
    using (DeflateStream defstream = new DeflateStream(outstream, CompressionLevel.Optimal))
    {
        instream.CopyTo(defstream);
    }

    FileInfo f1 = new FileInfo(inputFilePath), f2 = new FileInfo(outputFilePath);
    Console.WriteLine($"压缩前文件大小:{f1.Length}");
    Console.WriteLine($"压缩后文件大小:{f2.Length}");
    Console.Read();

创建Zip压缩文档

  ZipArchive类支持对zip压缩文档的基本管理,压缩文档中的每个文件由ZipArchiveEntry类进行维护。Delete方法可将文件从zip文档中删除;Open方法将得到一个流实例,可以对压缩文档中的文件实体进行读写。

    string zipFile = "demo.zip";

    // 生成 zip 文档
    if (File.Exists(zipFile))
        File.Delete(zipFile);

    using (FileStream outfs = File.Create(zipFile))
    {
        using (ZipArchive zip = new ZipArchive(outfs, ZipArchiveMode.Create))
        {
            // 第一个文件
            ZipArchiveEntry et1 = zip.CreateEntry("docs/doc1.txt");
            using (Stream stream = et1.Open())
            {
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.Write("示例文档 A");
                }
            }
            // 第二个文件
            ZipArchiveEntry et2 = zip.CreateEntry("docs/doc2.txt");
            using (Stream stream = et2.Open())
            {
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.Write("示例文档 B");
                }
            }
            // 第三个文件
            ZipArchiveEntry et3 = zip.CreateEntry("docs/doc3.txt");
            using (Stream stream = et3.Open())
            {
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    writer.Write("示例文档 C");
                }
            }
        }
    }

    // 将三个文件解压出来
    using(FileStream instream = File.OpenRead(zipFile))
    {
        using(ZipArchive zip = new ZipArchive(instream))
        {
            foreach(ZipArchiveEntry et in zip.Entries)
            {
                using(Stream stream = et.Open())
                {
                    using(FileStream fsout = File.Create(et.Name))
                    {
                        stream.CopyTo(fsout);
                    }
                }
            }
        }
    }

使用GZipStream类压缩文件

  GZIP(全称GNUzip)扩展名为.gz,是一种数据压缩格式,以GZipStream类来封装GZip算法相关功能。

    Console.WriteLine("请输入待压缩文件的路径:");
    string inFilePath = Console.ReadLine();
    string outFileName = "demo.gz";

    if (File.Exists(outFileName))
        File.Delete(outFileName);

    using (FileStream fsIn = File.OpenRead(inFilePath))
    using (FileStream fsOut = File.Create(outFileName))
    {
        using (GZipStream gz = new GZipStream(fsOut, CompressionMode.Compress))
        {
            fsIn.CopyTo(gz);
        }
    }

    FileInfo info1 = new FileInfo(inFilePath);
    FileInfo info2 = new FileInfo(outFileName);
    Console.WriteLine($"压缩前,文件大小:{info1.Length}");
    Console.WriteLine($"压缩后,文件大小:{info2.Length}");

    Console.Read();
posted @ 2020-12-16 21:27  一纸年华  阅读(8)  评论(0编辑  收藏  举报  来源