zoukankan      html  css  js  c++  java
  • C#文件或文件夹压缩和解压

    C#文件或文件夹压缩和解压方法有很多,本文通过使用ICSharpCode.SharpZipLib.dll来进行压缩解压

    1、新建一个winform项目,选择项目右键 管理NuGet程序包,搜索ICSharpCode.SharpZipLib,进行安装,

    如下所示

    2、项目winform窗体添加测试按钮 压缩和解压

     3、具体代码如下

    using ICSharpCode.SharpZipLib.Checksums;
    using ICSharpCode.SharpZipLib.Zip;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp2._0
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Button12_Click(object sender, EventArgs e)
            {
                ZipFile(@"F:PersonLongtengLongtengSlnWindowsFormsApp2.0inDebugdevicelog", @"F:PersonLongtengLongtengSlnWindowsFormsApp2.0inDebugdevicelog.zip");
                MessageBox.Show("压缩  成功");
            }
    
            private void Button13_Click(object sender, EventArgs e)
            {
                UnZipFile(@"F:PersonLongtengLongtengSlnWindowsFormsApp2.0inDebugdevicelog.zip", @"F:PersonLongtengLongtengSlnWindowsFormsApp2.0inDebugdevicelog11");
                MessageBox.Show("解压   成功");
            }
    
            public void ZipFile(string strFile, string strZip)
            {
                if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
                {
                    strFile += Path.DirectorySeparatorChar;
                }
                ZipOutputStream outstream = new ZipOutputStream(File.Create(strZip));
                outstream.SetLevel(6);
                ZipCompress(strFile, outstream, strFile);
                outstream.Finish();
                outstream.Close();
            }
    
            public void ZipCompress(string strFile, ZipOutputStream outstream, string staticFile)
            {
                if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
                {
                    strFile += Path.DirectorySeparatorChar;
                }
                Crc32 crc = new Crc32();
                //获取指定目录下所有文件和子目录文件名称
                string[] filenames = Directory.GetFileSystemEntries(strFile);
                //遍历文件
                foreach (string file in filenames)
                {
                    if (Directory.Exists(file))
                    {
                        ZipCompress(file, outstream, staticFile);
                    }
                    //否则,直接压缩文件
                    else
                    {
                        //打开文件
                        FileStream fs = File.OpenRead(file);
                        //定义缓存区对象
                        byte[] buffer = new byte[fs.Length];
                        //通过字符流,读取文件
                        fs.Read(buffer, 0, buffer.Length);
                        //得到目录下的文件(比如:D:Debug1	est),test
                        string tempfile = file.Substring(staticFile.LastIndexOf("\") + 1);
                        ZipEntry entry = new ZipEntry(tempfile);
                        entry.DateTime = DateTime.Now;
                        entry.Size = fs.Length;
                        fs.Close();
                        crc.Reset();
                        crc.Update(buffer);
                        entry.Crc = crc.Value;
                        outstream.PutNextEntry(entry);
                        //写文件
                        outstream.Write(buffer, 0, buffer.Length);
                    }
                }
            }
    
            public string UnZipFile(string TargetFile, string fileDir)
            {
                string rootFile = "";
                try
                {
                    if (!Directory.Exists(fileDir))
                    {
                        Directory.CreateDirectory(fileDir);
                    }
                    //读取压缩文件(zip文件),准备解压缩
                    ZipInputStream inputstream = new ZipInputStream(File.OpenRead(TargetFile.Trim()));
                    ZipEntry entry;
                    string path = fileDir;
                    //解压出来的文件保存路径
                    string rootDir = "";
                    //根目录下的第一个子文件夹的名称
                    while ((entry = inputstream.GetNextEntry()) != null)
                    {
                        rootDir = Path.GetDirectoryName(entry.Name);
                        //得到根目录下的第一级子文件夹的名称
                        if (rootDir.IndexOf("\") >= 0)
                        {
                            rootDir = rootDir.Substring(0, rootDir.IndexOf("\") + 1);
                        }
                        string dir = Path.GetDirectoryName(entry.Name);
                        //得到根目录下的第一级子文件夹下的子文件夹名称
                        string fileName = Path.GetFileName(entry.Name);
                        //根目录下的文件名称
                        if (dir != "")
                        {
                            //创建根目录下的子文件夹,不限制级别
                            if (!Directory.Exists(fileDir + "\" + dir))
                            {
                                path = fileDir + "\" + dir;
                                //在指定的路径创建文件夹
                                Directory.CreateDirectory(path);
                            }
                        }
                        else if (dir == "" && fileName != "")
                        {
                            //根目录下的文件
                            path = fileDir;
                            rootFile = fileName;
                        }
                        else if (dir != "" && fileName != "")
                        {
                            //根目录下的第一级子文件夹下的文件
                            if (dir.IndexOf("\") > 0)
                            {
                                //指定文件保存路径
                                path = fileDir + "\" + dir;
                            }
                        }
                        if (dir == rootDir)
                        {
                            //判断是不是需要保存在根目录下的文件
                            path = fileDir + "\" + rootDir;
                        }
    
                        //以下为解压zip文件的基本步骤
                        //基本思路:遍历压缩文件里的所有文件,创建一个相同的文件
                        if (fileName != String.Empty)
                        {
                            FileStream fs = File.Create(path + "\" + fileName);
                            int size = 2048;
                            byte[] data = new byte[2048];
                            while (true)
                            {
                                size = inputstream.Read(data, 0, data.Length);
                                if (size > 0)
                                {
                                    fs.Write(data, 0, size);
                                }
                                else
                                {
                                    break;
                                }
                            }
                            fs.Close();
                        }
                    }
                    inputstream.Close();
                    return rootFile;
                }
                catch (Exception ex)
                {
                   return ex.Message;
                }
            }
    
            /// <summary>
            /// 批量压缩事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnBatchZipFlo_Click(object sender, EventArgs e)
            {
                string path1 = "D:\123\";   //待压缩的目录文件
                string path2 = "D:\456\";   //压缩后存放目录文件
                //获取指定目录下所有文件和子文件名称(所有待压缩的文件)
                string[] files = Directory.GetFileSystemEntries(path1);
                //ZipFloClass zc = new ZipFloClass();
                //遍历指定目录下文件路径
                foreach (string file in files)
                {
                    //截取文件路径的文件名
                    var filename = file.Substring(file.LastIndexOf("\") + 1);
                    //调用压缩方法(参数1:待压缩的文件目录,参数2:压缩后的文件目录(包含后缀))
                    ZipFile(path1 + filename, path2 + filename + ".zip");
                }
            }
    
            /// <summary>
            /// 批量解压事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnBatchUnZipFlo_Click(object sender, EventArgs e)
            {
                string msg = "";
                string path2 = "D:\123\";
                string path3 = "D:\456\";
                //获取指定目录下所有文件和子文件名称(所有待解压的压缩文件)
                string[] files = Directory.GetFileSystemEntries(path2);
                //UnZipFloClass uzc = new UnZipFloClass();
                //遍历所有压缩文件路径
                foreach (string file in files)
                {
                    //获取压缩包名称(包括后缀名)
                    var filename = file.Substring(file.LastIndexOf("\") + 1);
                    //得到压缩包名称(没有后缀)
                    filename = filename.Substring(0, filename.LastIndexOf("."));
                    //判断解压的路径是否存在
                    if (!Directory.Exists(path3 + filename))
                    {
                        //没有,则创建这个路径
                        Directory.CreateDirectory(path3 + filename);
                    }
                    //调用解压方法(参数1:待解压的压缩文件路径(带后缀名),参数2:解压后存放的文件路径,参数3:返工是否解压成功)
                    UnZipFile(file, path3 + filename);
                }
                MessageBox.Show("批量解压成功");
            }
        }
    }

    原文链接:https://www.cnblogs.com/xielong/p/6165550.html

  • 相关阅读:
    从无到有制作Deb包的一个实例
    Redis内存存储结构分析
    岳麓实践论
    金砖四国(巴西、俄罗斯、印度和中国)
    用LLVM开发新语言
    QQ云输入法
    http://baike.baidu.com/view/1926473.htm
    21世纪商业评论
    update ubuntu to 11.10
    gnu make 中文手册教程pdf
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/11593507.html
Copyright © 2011-2022 走看看