• C#解压或压缩文件夹


    最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享。
    这里主要解决文件夹包含文件夹的解压缩问题。
    1)下载SharpZipLib.dll,在http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx中有最新免费版本,“Assemblies for .NET 1.1, .NET 2.0, .NET CF 1.0, .NET CF 2.0: Download [297 KB] ”点击Download可以下载,解压后里边有好多文件夹,因为不同的版本,我用的FW2.0。
    2)引用SharpZipLib.dll,在项目中点击项目右键-->添加引用-->浏览,找到要添加的DLL-->确认


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using ICSharpCode.SharpZipLib;
    using ICSharpCode.SharpZipLib.Checksums;
    using ICSharpCode.SharpZipLib.Zip;

    /*
     * 
    http://www.icsharpcode.net/OpenSource/SharpZipLib/ 下载ICSharpCode.SharpZipLib
    * 解压缩
    * 该程序压缩和解压配合才能使用
    * 普通用 Winrar 压缩的文件该解压不能通过
    */
    namespace ZipApplication
    {

        
    #region ZipClass

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

            
    #region ZipFileDictory

            
    /// <summary>
            
    /// 递归压缩文件夹方法
            
    /// </summary>
            
    /// <param name="FolderToZip"></param>
            
    /// <param name="s"></param>
            
    /// <param name="ParentFolderName"></param>
            private static 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 static 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 static 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 static 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 static bool Zip(string FileToZip, string ZipedFile)
            {
                
    return Zip(FileToZip, ZipedFile, "");
            }

            
    #endregion
        }

        
    #endregion


        
    #region UnZipClass

        
    /// <summary>
        
    ///  解压类
        
    /// </summary>
        public class UnZipClass
        {

            
    #region UnZip

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

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


                
    using (ZipInputStream s = new ZipInputStream(File.OpenRead(FileToUpZip)))
                {

                    
    if (!string.IsNullOrEmpty(Password.Trim()))
                        s.Password 
    = Password.Trim();

                    ZipEntry theEntry;

                    
    int size = 2048;
                    
    long fszie;
                    
    int byteLenght;
                    

                    
    while ((theEntry = s.GetNextEntry()) != null)
                    {
                        
                        System.Windows.Forms.MessageBox.Show(s.Length.ToString());
                        
    //Console.WriteLine(theEntry.Name);

                        
    string directoryName = Path.GetDirectoryName(theEntry.Name);
                        
    string fileName = Path.GetFileName(theEntry.Name);

                        
    // create directory
                        if (directoryName.Length > 0)
                        {
                            Directory.CreateDirectory(directoryName);
                        }

                        
    if (fileName != String.Empty)
                        {
                            fszie 
    = theEntry.Size;
                            
    using (FileStream streamWriter = File.Create(theEntry.Name))
                            {
                                
    while (fszie > 0)
                                {
                                    
    if (fszie > (long)size)
                                        byteLenght 
    = size;
                                    
    else
                                        byteLenght 
    = Convert.ToInt32(fszie);
                                    fszie 
    = fszie - size;
                                    
    byte[] data = new byte[byteLenght];
                                    s.Read(data, 
    0, byteLenght);
                                    streamWriter.Write(data, 
    0, byteLenght);
                                }
                            }
                        }
                    }
                }



                
    //ZipInputStream s = null;
                
    //ZipEntry theEntry = null;

                
    //string fileName;
                
    //FileStream streamWriter = null;
                
    //try
                
    //{
                
    //    s = new ZipInputStream(File.OpenRead(FileToUpZip));
                
    //    if (!string.IsNullOrEmpty(Password.Trim()))
                
    //        s.Password = Password.Trim();

                
    //    int size = 2048;
                
    //    long fszie;
                
    //    int byteLenght;

                    

                
    //    while ((theEntry = s.GetNextEntry()) != null)
                
    //    {
                
    //        fileName = Path.Combine(ZipedFolder, theEntry.Name);
                
    //        ///判断文件路径是否是文件夹
                
    //        if (fileName.EndsWith("/") || fileName.EndsWith("\\"))
                
    //        {
                
    //            Directory.CreateDirectory(fileName);
                
    //            continue;
                
    //        }
                
    //        streamWriter = File.Create(fileName);
                
    //        fszie = theEntry.Size;
                
    //        if (fszie > 0)
                
    //        {
                
    //            while (fszie > 0)
                
    //            {
                
    //                if (fszie > (long)size)
                
    //                    byteLenght = size;
                
    //                else
                
    //                    byteLenght = Convert.ToInt32(fszie);
                
    //                fszie = fszie - size;
                
    //                byte[] data = new byte[byteLenght];
                
    //                s.Read(data, 0, byteLenght);
                
    //                streamWriter.Write(data, 0, byteLenght);
                
    //            }
                
    //        }
                
    //    }
                
    //}
                
    //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);
                
    //}
            }


            
    /// <summary>
            
    /// 解压功能(解压压缩文件到指定目录)
            
    /// </summary>
            
    /// <param name="FileToUpZip">待解压的文件</param>
            
    /// <param name="ZipedFolder">指定解压目标目录</param>
            public static void UnZip(string FileToUpZip, string ZipedFolder)
            {
                UnZip(FileToUpZip, ZipedFolder, 
    "");
            }

            
    #endregion

        }

        
    #endregion

    }

  • 相关阅读:
    JS绑定种类汇总
    JS的块级作用域
    JS中的几种函数
    区分词法作用域(js)与动态作用域(精!)
    JS Dom节点操作demo!
    JS作用域相关知识(#精)
    js解析器(重要!)
    JS之鼠标在盒子中的位置
    JS之鼠标跟随
    JS之事件对象体验
  • 原文地址:https://www.cnblogs.com/liufei88866/p/1766618.html
Copyright © 2020-2023  润新知