c#自带类实现的多文件压缩和解压

c#自带的System.IO.Compression命名空间下的压缩类实现的多文件压缩和解压功能,缺点是多文件压缩包的解压只能调用自身的解压方法,和现有的压缩软件不兼容。下面的代码没有把多文件的目录结构加进去

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;

namespace Test.Zip
{
    class CompressHelper
    {
        /// <summary>
        /// 单文件压缩(生成的压缩包和第三方的解压软件兼容)
        /// </summary>
        /// <param name="sourceFilePath"></param>
        /// <returns></returns>
        public string CompressSingle(string sourceFilePath)
        {
            string zipFileName = sourceFilePath + ".gz";
            using (FileStream sourceFileStream = new FileInfo(sourceFilePath).OpenRead())
            {
                using (FileStream zipFileStream = File.Create(zipFileName))
                {
                    using (GZipStream zipStream = new GZipStream(zipFileStream, CompressionMode.Compress))
                    {
                        sourceFileStream.CopyTo(zipStream);
                    }
                }
            }
            return zipFileName;
        }
        /// <summary>
        /// 自定义多文件压缩(生成的压缩包和第三方的压缩文件解压不兼容)
        /// </summary>
        /// <param name="sourceFileList">文件列表</param>
        /// <param name="saveFullPath">压缩包全路径</param>
        public void CompressMulti(string[] sourceFileList, string saveFullPath)
        {
            MemoryStream ms = new MemoryStream();
            foreach (string filePath in sourceFileList)
            {
                Console.WriteLine(filePath);
                if (File.Exists(filePath))
                {
                    string fileName = Path.GetFileName(filePath);
                    byte[] fileNameBytes = System.Text.Encoding.UTF8.GetBytes(fileName);
                    byte[] sizeBytes = BitConverter.GetBytes(fileNameBytes.Length);
                    ms.Write(sizeBytes, 0, sizeBytes.Length);
                    ms.Write(fileNameBytes, 0, fileNameBytes.Length);
                    byte[] fileContentBytes = System.IO.File.ReadAllBytes(filePath);
                    ms.Write(BitConverter.GetBytes(fileContentBytes.Length), 0, 4);
                    ms.Write(fileContentBytes, 0, fileContentBytes.Length);
                }
            }
            ms.Flush();
            ms.Position = 0;
            using (FileStream zipFileStream = File.Create(saveFullPath))
            {
                using (GZipStream zipStream = new GZipStream(zipFileStream, CompressionMode.Compress))
                {
                    ms.Position = 0;
                    ms.CopyTo(zipStream);
                }
            }
            ms.Close();
        }

        /// <summary>
        /// 多文件压缩解压
        /// </summary>
        /// <param name="zipPath">压缩文件路径</param>
        /// <param name="targetPath">解压目录</param>
        public void DeCompressMulti(string zipPath, string targetPath)
        {
            byte[] fileSize = new byte[4];
            if (File.Exists(zipPath))
            {
                using (FileStream fStream = File.Open(zipPath, FileMode.Open))
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        using (GZipStream zipStream = new GZipStream(fStream, CompressionMode.Decompress))
                        {
                            zipStream.CopyTo(ms);
                        }
                        ms.Position = 0;
                        while (ms.Position != ms.Length)
                        {
                            ms.Read(fileSize, 0, fileSize.Length);
                            int fileNameLength = BitConverter.ToInt32(fileSize, 0);
                            byte[] fileNameBytes = new byte[fileNameLength];
                            ms.Read(fileNameBytes, 0, fileNameBytes.Length);
                            string fileName = System.Text.Encoding.UTF8.GetString(fileNameBytes);
                            string fileFulleName = targetPath + fileName;
                            ms.Read(fileSize, 0, 4);
                            int fileContentLength = BitConverter.ToInt32(fileSize, 0);
                            byte[] fileContentBytes = new byte[fileContentLength];
                            ms.Read(fileContentBytes, 0, fileContentBytes.Length);
                            using (FileStream childFileStream = File.Create(fileFulleName))
                            {
                                childFileStream.Write(fileContentBytes, 0, fileContentBytes.Length);
                            }
                        }
                    }
                }
            }
        }
    }
}

调用示例:

 List<string> strList = new List<string>() { @"D:\文档\soapUI工程\Synchro-soapui-project.xml", @"D:\文档\soapUI工程\PKBSML-soapui-project.xml", @"D:\文档\soapUI工程\PKBSML-soapui-project.xml" };
            var zipHelper = new Test.Zip.CompressHelper();
            zipHelper.CompressMulti(strList.ToArray(), @"D:\wulala.gz");
            zipHelper.DeCompressMulti(@"D:\wulala.gz", @"D:\web\");


原文地址:https://www.cnblogs.com/zpyplan/p/9567852.html

时间: 2024-10-13 09:10:25

c#自带类实现的多文件压缩和解压的相关文章

34模块-zip【文件压缩和解压、图片压缩和编辑】

Zip模块管理文件压缩和解压,通过plus.zip可获取压缩管理对象. 比较常用的就是  对图片进行压缩.转码.旋转操作了 <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no&q

.net文件压缩和解压及中文文件夹名称乱码问题

/**************************注释区域内为引用http://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html的博客内容 在.NET可以通过多种方式实现zip的压缩和解压:1.使用System.IO.Packaging:2.使用第三方类库:3.通过 System.IO.Compression 命名空间中新增的ZipArchive.ZipFile等类实现. 一.使用System.IO.Packaging压缩和解压

C# ICSharpCode.SharpZipLib.dll文件压缩和解压功能类整理,上传文件或下载文件很常用

工作中我们很多时候需要进行对文件进行压缩,比较通用的压缩的dll就是ICSharpCode.SharpZipLib.dll,废话不多了,网上也有很多的资料,我将其最常用的两个函数整理了一下,提供了一个通用的类,这样在工作中可以快速的完成压缩和解压缩的动作哦 官网下载地址:  http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx 1. 在项目中添加对ICSharpCode.SharpZipLib.dll的引用: 2. 在需要

iOS网络-ZipArchive框架的文件压缩和解压

导入第三方框架ZipArchive之后还要在系统库文件中导入一个如下文件(搜索libz出来的任何一个都可以) 文件压缩 -(void)zip { NSArray *arrayM = @[@"/Users/gengqun/Desktop/Snip20160118_866.png", @"/Users/gengqun/Desktop/Snip20160118_867.png", @"/Users/gengqun/Desktop/Snip20160118_868

4_Linux_文件压缩和解压指令

3.4压缩解压命令.gz .tar.gz .zip .bz2 1)gzip 仅压缩文件 gzip命令用于压缩文件,英文原意为GNU zip,所在路径/bin/gzip,其语法格式为: gzip [文件] 压缩后的文件格式为.gz. 注: 1只能压缩文件 2不保留原文件 ? 2)gunzip 解压gunzip [压缩文件]或gzip –d [压缩文件] 3)tar 压缩文件和目录 tar命令用于打包目录,所在路径为/bin/tar,其语法格式为: tar 选项[-zcf] [压缩后的文件名] [目

Linux文件压缩和解压使用记录

一:tar(可压缩可解压) tar命令是Unix/Linux系统中备份文件的可靠方法,几乎可以工作于任何环境中,它的使用权限是所有用户.但是tar本身只是一个文件打包工具,只有和其他工具组合时才具有压缩/解压文件功能. 使用tar命令压缩文件的格式是:tar  参数[主选项+辅选项]   '文件或目录 ' 参数主选项 -c 创建新的档案文件.如果用户想备份一个目录或是一些文件,就要选择这个选项. -r 把要存档的文件追加到档案文件的未尾.例如用户已经做好备份文件,又发现还有一个目录或是一些文件忘

python学习shutil模块的文件压缩和解压用法

shutil模块可以创建压缩包并返回文件路径,例如 zip,tar,下面详细其用法 base_name 压缩包的文件名,也可以是压缩包的路径,只是文件名时,则保存至当前目录,否则保存指定路径 data_bak 保存当前路径 format  压缩包种类  zip tar bztar gztar root_dir 要压缩的文件路径 owner 用户 group 用户组 logger 用于记录日志 1,压缩的用法 import zipfile z=zipfile.Zipfile('a.zip','w'

java文件压缩和解压

功能实现. package com.test; import java.io.File; import java.io.BufferedOutputStream; import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.FileInputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;

Zlib文件压缩和解压

开源代码:http://www.zlib.net/zlib使用手册:http://www.zlib.net/manual.htmlzlib wince版:http://www.tenik.co.jp/~adachi/wince/在这里,你可以查看基于各种操作系统平台的压缩与解缩代码实现. <<<<<<<<<<<<<<<<<<<<<<<<<<<&l