`
LiuXiaoYong
  • 浏览: 31822 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

C# /.NET压缩解压文件夹及文件夹里面的子文件、文件夹

    博客分类:
  • .NET
阅读更多
最近做一个项目需要压缩,解压文件夹及文件夹里面的子文件夹、文件,在网上找了许多资料,有两种实例:
实例一:
#region 压缩文件
        /// 递归压缩文件夹方法 
        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;
        }

        /// <summary>
        /// 压缩目录
        /// </summary>
        /// <param name="FolderToZip">待压缩的文件夹,全路径格式</param>
        /// <param name="ZipedFile">压缩后的文件名,全路径格式</param>
        /// <param name="Password"></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);
            s.Password = Password;

            res = ZipFileDictory(FolderToZip, s, "");

            s.Finish();
            s.Close();

            return res;
        }

        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="FileToZip">要进行压缩的文件名</param>
        /// <param name="ZipedFile">压缩后生成的压缩文件名</param>
        /// <param name="Password"></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);
                ZipStream.Password = Password;
                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;
        }

        /// <summary>
        /// 压缩文件 和 文件夹
        /// </summary>
        /// <param name="FileToZip">待压缩的文件或文件夹,全路径格式</param>
        /// <param name="ZipedFile">压缩后生成的压缩文件名,全路径格式</param>
        /// <param name="Password"></param>
        /// <returns></returns>
        private 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;
            }
        }
        #endregion

        #region 解压文件
        /// <summary>
        /// 解压功能(解压压缩文件到指定目录)
        /// </summary>
        /// <param name="FileToUpZip">待解压的文件</param>
        /// <param name="ZipedFolder">指定解压目标目录</param>
        /// <param name="Password"></param>
        private 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



实例二:
#region 压缩文件方法二
        public void ZipFilenew(string strFileFolder, string strZip)
        {
            if (strFileFolder[strFileFolder.Length - 1] != Path.DirectorySeparatorChar)
                strFileFolder += Path.DirectorySeparatorChar;
            ZipOutputStream s = new ZipOutputStream(File.Create(strZip));
            s.SetLevel(6); // 0 - store only to 9 - means best compression
            zip(strFileFolder, strZip, s);
            s.Finish();
            s.Close();
        }

        private void zip(string strFile, string StoreFile, ZipOutputStream s)
        {
            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))
                {
                    zip(file, StoreFile, s);

                }
                else
                {
                    //打开压缩文件,开始压缩
                    FileStream fs = File.OpenRead(file);
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    string tempfile = file.Substring(StoreFile.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;
                    s.PutNextEntry(entry);
                    s.Write(buffer, 0, buffer.Length);
                }
            }
        }
        #endregion

        #region 解压文件方法二
        public string unZipFile(string TargetFile, string fileDir)
        {
            string rootFile = " ";
            try
            {
                //读取压缩文件(zip文件),准备解压缩
                ZipInputStream s = new ZipInputStream(File.OpenRead(TargetFile.Trim()));
                ZipEntry theEntry;
                string path = fileDir;
                //解压出来的文件保存的路径

                string rootDir = " ";
                //根目录下的第一个子文件夹的名称
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    rootDir = Path.GetDirectoryName(theEntry.Name);
                    //得到根目录下的第一级子文件夹的名称
                    if (rootDir.IndexOf("\\") >= 0)
                    {
                        rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1);
                    }
                    string dir = Path.GetDirectoryName(theEntry.Name);
                    //根目录下的第一级子文件夹的下的文件夹的名称
                    string fileName = Path.GetFileName(theEntry.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 streamWriter = File.Create(path + "\\" + 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;
                            }
                        }

                        streamWriter.Close();
                    }
                }
                s.Close();

                return rootFile;
            }
            catch (Exception ex)
            {
                return "1; " + ex.Message;
            }

        }
        #endregion


这里有个问题,实例二中的解压文件的时候,如果解压到的路径中存在解压文件中的文件,解压的时候不会覆盖,这点值得注意。
另外压缩解压文件要用到ICSharpCode.SharpZipLib.dll这个dll,网上可以搜到下载地址。
分享到:
评论

相关推荐

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

    总的来说,使用C#和WinForm创建文件夹的压缩解压工具,虽然涉及到的技术并不深奥,但实现一个完整且用户体验良好的应用仍然需要考虑很多细节,包括错误处理、用户交互以及性能优化。通过不断地实践和学习,你可以...

    C# .net解压缩程序 压缩 解压

    在.NET框架中,C#语言提供了丰富的库和API来实现文件的压缩和解压缩功能。本文将深入探讨如何使用C#进行文件的压缩与解压缩操作,主要关注使用System.IO.Compression命名空间中的ZipArchive类。 首先,让我们了解...

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

    在.NET开发中,压缩和解压文件或文件夹是一项常见的任务。本文将深入探讨如何使用C#实现这一功能,特别是如何使用带密码保护的压缩。我们将会关注两个库:DotNetZip和SharpCompress。 首先,DotNetZip是一个强大的...

    C#winform压缩解压文件夹

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

    vb.net 利用.net自带的GZipStream压缩或者解压文件的代码,不需要任何第三方控件

    网上很少有用VB写的压缩文件的代码,但是,在网络...另外加上了多层文件夹压缩解压。但是,因为时间有限,只是将文件全部读取到缓存处理,所以,针对大文件没有做特别的处理。例子里面有提示,根据需要自己改动一下吧。

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

    总之,C#提供了一套强大的工具来处理文件和文件夹的压缩解压,开发人员可以根据需求选择适合的API和算法。对于更复杂的需求,如加密、分块压缩或自定义压缩算法,可能需要深入研究更高级的库或实现自定义解决方案。...

    C#压缩及解压文件夹

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

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

    总结来说,C#的ZipArchive类提供了强大的文件和文件夹压缩解压功能,使得开发者能够方便地集成这些功能到自己的应用程序中。无论是简单的文件备份,还是复杂的文件传输,都可以借助这个类来实现。通过深入理解和熟练...

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

    要压缩一个文件夹,首先获取该文件夹的所有文件和子文件夹,然后对每个文件创建`ZipArchiveEntry`,设置其名称(相对于压缩文件的路径),并用文件内容填充。代码示例如下: ```csharp using System.IO; using ...

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

    在C#编程中,处理文件和文件夹的压缩与解压缩是常见的任务,尤其是在软件开发、数据备份或者文件传输场景中。本篇文章将详细介绍如何在C#中实现这个功能,并且重点讲解如何设置压缩文件的密码。 首先,我们需要引入...

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

    首先,创建一个`DirectoryInfo`对象代表要压缩的根目录,然后遍历其`GetFiles()`和`GetDirectories()`方法,对每个子文件和子文件夹调用上述的压缩文件方法。 五、解压缩文件 解压缩文件的过程与压缩相反,需要创建...

    .net 压缩和解压组件DLL

    .NET框架提供了一种方便的方式来处理压缩和解压缩文件,但默认情况下并不包含全面的压缩库。在这种情况下,开发者经常依赖第三方组件,如"7-Zip",它是一个强大的开源压缩工具,提供了API供编程人员使用。本文将详细...

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

    在C#编程中,处理文件和文件夹的压缩与解压是常见的任务,尤其是在数据传输、备份或存储优化中。本篇文章将详细讲解如何使用C#实现对文件和文件夹的压缩以及对`.zip`和`.rar`格式的解压。 首先,C#中的文件和文件夹...

    C# Zip 压缩和解压 通过引用System.IO.Compression.FileSystem 程序集实现

    在.NET框架4.5及以上版本中,C#提供了一个强大的工具来处理压缩和解压缩ZIP文件,这得益于引入了`System.IO.Compression.FileSystem`程序集。这个程序集为开发人员提供了一种简单、直观的方式来执行这些操作,无需...

    asp.net C# 压缩下载多文件 带实例

    在ASP.NET平台中,使用C#进行文件压缩和下载是一项常见的任务,特别是在处理大量数据或者提供批量下载服务时。这个实例主要关注如何将多个文件压缩为一个文件,并提供下载功能。接下来,我们将深入探讨实现这一功能...

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

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

    SQL 2005 + CLR 压缩/解压 文件夹

    在SQL Server 2005中,通过集成Common Language Runtime (CLR)功能,可以利用.NET Framework的类库来实现数据库内的文件压缩和解压缩操作。本文将深入探讨如何使用System.IO.Compression命名空间下的ZipArchive类,...

    C# 压缩解压文件

    在.NET框架中,C#程序员可以使用System.IO.Compression命名空间中的类来实现文件和文件夹的压缩与解压操作。这个命名空间包含了GZipStream、DeflateStream和ZipArchive等类,使得处理ZIP文件变得相当简单。下面我们...

    C#解压缩文件夹保存目录结构

    总的来说,C#解压缩文件夹并保存目录结构是开发过程中的一项实用技能,结合ASP.NET可以构建强大的文件服务,结合SQLDBA知识可以优化数据库管理。京华志和精华志这样的社区提供了丰富的学习材料,鼓励开发者分享和...

    C# 压缩解压文件程序

    在C#编程环境中,开发一个能够压缩和解压缩文件的程序是一项常见的任务,尤其是在处理大量数据存储和传输时...理解并熟练运用这些方法,你就能在VS2010或其他支持.NET Framework的环境中构建出功能完备的压缩解压工具。

Global site tag (gtag.js) - Google Analytics