`
Steven_zhu
  • 浏览: 2538 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

C#版的文件及文件夹的压缩解压

阅读更多
最近刚来新公司,投的是java不过好像进来是让做C++,但由于机器在申请中所以又跑到.net组里的空机子上帮忙去了。今天刚坐了个C#文件及文件夹的压缩解压。想想以后可能还会用到所以就放上来了。
using System.Windows.Forms;
using System.IO;
using ICSharpCode.SharpZipLib;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;

namespace ZipApplication
{
    public partial class Form1 : Form
    {
        string fullName = "";
        string destPath = "";
        ZipClass zp = new ZipClass();
        UnZipClass UZp = new UnZipClass();
        public Form1()
        {
            InitializeComponent();
        }


        #region 文件浏览
        /// <summary>
        /// 压缩浏览
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBroswer_Click(object sender, EventArgs e)
        {
            //待压缩文件

            folderBrowserDialog1.ShowDialog();
            fullName = folderBrowserDialog1.SelectedPath;
            textBox1.Text = fullName;
            //压缩到的路径
            destPath = System.IO.Path.GetDirectoryName(fullName);
            //压缩后的目标文件
            destPath = destPath + "\\" + System.IO.Path.GetFileNameWithoutExtension(fullName) + ".zip";
            
            

        }

        /// <summary>
        /// 解压浏览
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnUzipBro_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            fullName = openFileDialog1.FileName;
            textBox2.Text = fullName;
            //解压到的路径
            destPath = System.IO.Path.GetDirectoryName(fullName);
        }
        #endregion

        #region  压缩
        /// <summary>
        /// 压缩
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnZip_Click(object sender, EventArgs e)
        {

            zp.Zip(fullName, destPath);
            MessageBox.Show("压缩成功!");
        }
       
        #endregion

        #region 解压
        /// <summary>
        /// 解压
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnUnZip_Click(object sender, EventArgs e)
        {
            
            UZp.UnZip(fullName,destPath);
            MessageBox.Show("解压成功!");

        }
        #endregion

       
    }
    #region ZipClass压缩类

    /// <summary>
    /// 压缩类
    /// </summary>
    public class ZipClass
    {

        #region ZipFileDictory

        /// <summary>
        /// 递归压缩文件夹方法
        /// </summary>
        /// <param name="FolderToZip"></param>
        /// <param name="s"></param>
        /// <param name="ParentFolderName"></param>
        private  bool ZipFileDictory(string FolderToZip, ZipOutputStream s, string ParentFolderName)
        {
            bool res = true;
            string[] folders, filenames;
            ZipEntry entry = null;
            FileStream fs = null;
            Crc32 crc = new Crc32();
            try
            {
                //创建当前文件夹
                entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/"));  //加上 “/” 才会当成是文件夹创建
                s.PutNextEntry(entry);
                s.Flush();
                //先压缩文件,再递归压缩文件夹 
                filenames = Directory.GetFiles(FolderToZip);
                foreach (string file in filenames)
                {
                    //打开压缩文件
                    fs = File.OpenRead(file);

                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/" + Path.GetFileName(file)));
                    entry.DateTime = DateTime.Now;
                    entry.Size = fs.Length;
                    fs.Close();
                    crc.Reset();
                    crc.Update(buffer);
                    entry.Crc = crc.Value;
                    s.PutNextEntry(entry);
                    s.Write(buffer, 0, buffer.Length);
                }
            }
            catch
            {
                res = false;
            }
            finally
            {
                if (fs != null)
                {
                    fs.Close();
                    fs = null;
                }
                if (entry != null)
                    entry = null;
                GC.Collect();
                GC.Collect(1);
            }
            folders = Directory.GetDirectories(FolderToZip);
            foreach (string folder in folders)
            {
                if (!ZipFileDictory(folder, s, Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip))))
                    return false;
            }
            return res;
        }

        #endregion


        #region ZipFileDictory

        /// <summary>
        /// 压缩目录
        /// </summary>
        /// <param name="FolderToZip">待压缩的文件夹,全路径格式</param>
        /// <param name="ZipedFile">压缩后的文件名,全路径格式</param>
        /// <returns></returns>
        private  bool ZipFileDictory(string FolderToZip, string ZipedFile, string Password)
        {
            bool res;
            if (!Directory.Exists(FolderToZip))
                return false;
            ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFile));
            s.SetLevel(6);
            if (!string.IsNullOrEmpty(Password.Trim()))
                s.Password = Password.Trim();
            res = ZipFileDictory(FolderToZip, s, "");
            s.Finish();
            s.Close();
            return res;
        }

        #endregion

        #region ZipFile

        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="FileToZip">要进行压缩的文件名</param>
        /// <param name="ZipedFile">压缩后生成的压缩文件名</param>
        /// <returns></returns>
        private  bool ZipFile(string FileToZip, string ZipedFile, string Password)
        {
            //如果文件没有找到,则报错
            if (!File.Exists(FileToZip))
                throw new System.IO.FileNotFoundException("指定要压缩的文件: " + FileToZip + " 不存在!");
            //FileStream fs = null;
            FileStream ZipFile = null;
            ZipOutputStream ZipStream = null;
            ZipEntry ZipEntry = null;
            bool res = true;
            try
            {
                ZipFile = File.OpenRead(FileToZip);
                byte[] buffer = new byte[ZipFile.Length];
                ZipFile.Read(buffer, 0, buffer.Length);
                ZipFile.Close();
                ZipFile = File.Create(ZipedFile);
                ZipStream = new ZipOutputStream(ZipFile);
                if (!string.IsNullOrEmpty(Password.Trim()))
                    ZipStream.Password = Password.Trim();
                ZipEntry = new ZipEntry(Path.GetFileName(FileToZip));
                ZipStream.PutNextEntry(ZipEntry);
                ZipStream.SetLevel(6);
                ZipStream.Write(buffer, 0, buffer.Length);
            }
            catch
            {
                res = false;
            }
            finally
            {
                if (ZipEntry != null)
                {
                    ZipEntry = null;
                }
                if (ZipStream != null)
                {
                    ZipStream.Finish();
                    ZipStream.Close();
                }
                if (ZipFile != null)
                {
                    ZipFile.Close();
                    ZipFile = null;
                }
                GC.Collect();
                GC.Collect(1);
            }

            return res;
        }

        #endregion

        #region Zip

        /// <summary>
        /// 压缩文件 和 文件夹
        /// </summary>
        /// <param name="FileToZip">待压缩的文件或文件夹,全路径格式</param>
        /// <param name="ZipedFile">压缩后生成的压缩文件名,全路径格式</param>
        /// <param name="Password">压缩密码</param>
        /// <returns></returns>
        public  bool Zip(string FileToZip, string ZipedFile, string Password)
        {
            if (Directory.Exists(FileToZip))
            {
                return ZipFileDictory(FileToZip, ZipedFile, Password);
            }
            else if (File.Exists(FileToZip))
            {
                return ZipFile(FileToZip, ZipedFile, Password);
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 压缩文件 和 文件夹
        /// </summary>
        /// <param name="FileToZip">待压缩的文件或文件夹,全路径格式</param>
        /// <param name="ZipedFile">压缩后生成的压缩文件名,全路径格式</param>
        /// <returns></returns>
        public  bool Zip(string FileToZip, string ZipedFile)
        {
            return Zip(FileToZip, ZipedFile, "");
        }

        #endregion
    }

    #endregion

#region ZipClass解压类
    /// <summary>
    ///  解压类
    /// </summary>
    public class UnZipClass
    {
        /// <summary>
        /// 解压功能(解压压缩文件到指定目录)
        /// </summary>
        /// <param name="FileToUpZip">待解压的文件</param>
        /// <param name="ZipedFolder">指定解压目标目录</param>
        public static void UnZip(string FileToUpZip, string ZipedFolder, string Password)
        {
            if (!File.Exists(FileToUpZip))
            {
                return;
            }

            if (!Directory.Exists(ZipedFolder))
            {
                Directory.CreateDirectory(ZipedFolder);
            }

            ZipInputStream s = null;
            ZipEntry theEntry = null;

            string fileName;
            FileStream streamWriter = null;
            try
            {
                s = new ZipInputStream(File.OpenRead(FileToUpZip));
                s.Password = Password;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    if (theEntry.Name != String.Empty)
                    {
                        fileName = Path.Combine(ZipedFolder, theEntry.Name);
                        ///判断文件路径是否是文件夹
                        if (fileName.EndsWith("/") || fileName.EndsWith("\\"))
                        {
                            Directory.CreateDirectory(fileName);
                            continue;
                        }

                        streamWriter = File.Create(fileName);
                        int size = 2048;
                        byte[] data = new byte[2048];
                        while (true)
                        {
                            size = s.Read(data, 0, data.Length);
                            if (size > 0)
                            {
                                streamWriter.Write(data, 0, size);
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                }
            }
            finally
            {
                if (streamWriter != null)
                {
                    streamWriter.Close();
                    streamWriter = null;
                }
                if (theEntry != null)
                {
                    theEntry = null;
                }
                if (s != null)
                {
                    s.Close();
                    s = null;
                }
                GC.Collect();
                GC.Collect(1);
            }
        }
    }
    #endregion
   }


上次程序的解压路径有点问题,只支持对话框模式,不支持指定路径模式。这次修改了这个BUG
0
0
分享到:
评论

相关推荐

    C#压缩文件夹(所有文件及文件夹)

    对文件夹下的所有子目录及所有文件进行压缩和解压,需在一起使用,有需要的可以下载下

    C#通用文件及文件夹压缩类文件

    本压缩包中的"C#通用文件及文件夹压缩类文件"可能包含了一个自定义的C#类库,用于简化和扩展这些功能。 首先,让我们了解一下.NET Framework自带的ZipArchive类。ZipArchive提供了一组方法和属性,允许我们创建一个...

    详解C#压缩、解压文件夹/文件(带密码)

    总结,C#中压缩和解压文件或文件夹可以通过如DotNetZip和SharpCompress这样的库轻松实现。DotNetZip提供了内置的密码保护功能,而SharpCompress则需要自定义加密来实现相同效果。选择哪种库取决于项目的具体需求,...

    C#实现winform压缩解压文件夹

    以下我们将详细探讨如何使用C#实现WinForm的文件夹压缩和解压缩功能。 首先,我们需要了解两个关键的库:System.IO.Compression和System.IO.Compression.ZipFile。这两个库分别提供了对压缩和解压缩的基本支持。...

    C#winform压缩解压文件夹

    解压缩文件夹则相对简单,主要涉及读取ZIP文件内容并将其解压到目标文件夹: 1. 创建ZipFile或FileStream对象,打开ZIP文件。 2. 遍历ZipFile的Entries,获取每个压缩条目。 3. 对于每个条目,检查是否为文件或目录...

    c#压缩解压(可以压缩解压文件夹附有源妈)

    首先,标题提到的"C#压缩解压"指的是使用C#语言编写的代码库或库文件,它提供了类似于WinRAR的功能。WinRAR是一款流行的数据压缩工具,能够压缩和解压缩多种格式的文件,包括RAR和ZIP。在C#中,我们也可以通过引入...

    如何压缩多个文件\文件夹(GZipStream and C#)

    在.NET Framework 2.0及更高版本中,微软引入了`System.IO.Compression`命名空间,为开发者提供了方便的文件和文件夹压缩与解压缩功能。`GZipStream`是这个命名空间中的一个关键类,它实现了GZIP压缩算法,可以用于...

    C#调用系统API压缩文件及文件夹

    说明:第一个方法为目前的主流压缩解压方法,大部分软件都通用,但是较老版本的解压软件可能不支持。第二个方法为系统自带,主要是适用特定的场景用比较老版本的解压软件,这个时候用第二种方法兼容性会非常好,几乎...

    C#操作文件及文件夹

    - C#中可以使用 `System.IO.Compression` 命名空间的 `ZipFile` 类进行文件的压缩和解压缩操作。 以上是C#操作文件和文件夹的一些核心知识点,理解并熟练运用这些概念,可以高效地管理应用程序的数据存储需求。在...

    C#压缩及解压文件夹

    在C#编程中,压缩和解压文件夹是常见的任务,尤其在数据传输、存储优化或者备份场景下。本文将详细讲解如何使用C#来实现这个功能,主要关注ZIP格式的压缩与解压缩。 首先,我们需要引入.NET Framework或.NET Core中...

    C#压缩文件和文件夹

    ### 四、C#代码实现文件夹压缩 #### 方法1:压缩整个文件夹 ```csharp private void DirectoryToZip(string path, string address) { string[] filenames = Directory.GetFiles(path); using (ZipOutputStream ...

    C#文件及文件夹自动打包程序_压缩_解压缩

    本篇文章将详细探讨如何使用C#实现文件及文件夹的自动打包(压缩)以及解压缩功能,特别关注RAR文件格式。 1. **压缩RAR文件:** - .NET框架并不直接支持RAR压缩,但可以通过第三方库如`SharpCompress`或`...

    C# 对文件夹进行压缩和下载

    通过以上步骤,你可以实现C# WebForm应用中的文件夹压缩和下载功能。确保处理异常和错误情况,如文件不存在、权限问题等,以提供健壮的用户体验。同时,根据实际情况考虑性能优化,比如分块读写大文件,避免一次性...

    C# 【文件/文件夹】压缩、解压类

    首先,C#中的文件和文件夹压缩通常依赖于.NET Framework或.NET Core提供的`System.IO.Compression`命名空间。特别是,`System.IO.Compression.ZipFile`类提供了一组静态方法,用于创建、读取、写入和修改.zip归档...

    C# 压缩解压文件程序

    以上就是C#中使用`System.IO.Compression`命名空间进行文件和文件夹压缩、解压缩的基本操作。理解并熟练运用这些方法,你就能在VS2010或其他支持.NET Framework的环境中构建出功能完备的压缩解压工具。

    支持多文件及文件夹压缩工具

    "支持多文件及文件夹压缩工具"这一主题聚焦于能够处理多个文件和目录并将其整合到单个压缩文件中的软件或库。在本篇中,我们将深入探讨这一功能的工作原理、常见算法、应用场景以及相关的编程实现。 首先,我们要...

    文件、文件夹压缩、加密

    这段代码会将sourceFolderPath指定的文件夹压缩为一个ZIP文件,保存在targetArchivePath指定的位置。 接下来,我们讨论文件的加密。在C#中,可以使用System.Security.Cryptography命名空间下的类来实现加密。AES...

    c# 解压缩文件或文件夹代码 可设置压缩密码

    以上就是使用C#进行文件或文件夹压缩、解压缩以及设置密码的基本操作。通过理解这些基础,你可以根据实际需求扩展功能,比如添加进度显示、错误处理等。在实际项目中,可以结合具体业务逻辑,灵活应用这些技术。

    C# 文件压缩-指定文件压缩

    在C#编程环境中,文件压缩是一项常见的任务,特别是在数据存储、传输或备份时。本教程将深入探讨如何使用C#来实现对特定文件的压缩。我们将主要关注`System.IO.Compression`命名空间中的ZipArchive类,它是.NET ...

Global site tag (gtag.js) - Google Analytics