你所在位置:首页Asp.net开发 → asp.net 压缩解压缩zip文件

asp.net 压缩解压缩zip文件

发布时间:2019-07-12 [csharp] using System; 
using System.IO; 
using System.Diagnostics; 
using Microsoft.Win32; 
 
using ICSharpCode.SharpZipLib.Checksums; 
using ICSharpCode.SharpZipLib.Zip; 
 
///压缩、解压缩类 
namespace DotNet.Utilities 

    public class SharpZip 
    { 
        public SharpZip() 
        { } 
 
        /// <summary> 
        /// 压缩 
        /// </summary>  
        /// <param name="filename"> 压缩后的文件名(包含物理路径)</param> 
        /// <param name="directory">待压缩的文件夹(包含物理路径)</param> 
        public static void PackFiles(string filename, string directory) 
        { 
            try 
            { 
                FastZip fz = new FastZip(); 
                fz.CreateEmptyDirectories = true; 
                fz.CreateZip(filename, directory, true, ""); 
                fz = null; 
            } 
            catch (Exception) 
            { 
                throw; 
            } 
        } 
 
        /// <summary> 
        /// 解压缩 
        /// </summary> 
        /// <param name="file">待解压文件名(包含物理路径)</param> 
        /// <param name="dir"> 解压到哪个目录中(包含物理路径)</param> 
        public static bool UnpackFiles(string file, string dir) 
        { 
            try 
            { 
                if (!Directory.Exists(dir)) 
                { 
                    Directory.CreateDirectory(dir); 
                } 
                ZipInputStream s = new ZipInputStream(File.OpenRead(file)); 
                ZipEntry theEntry; 
                while ((theEntry = s.GetNextEntry()) != null) 
                { 
                    string directoryName = Path.GetDirectoryName(theEntry.Name); 
                    string fileName = Path.GetFileName(theEntry.Name); 
                    if (directoryName != String.Empty) 
                    { 
                        Directory.CreateDirectory(dir + directoryName); 
                    } 
                    if (fileName != String.Empty) 
                    { 
                        FileStream streamWriter = File.Create(dir + theEntry.Name); 
                        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 true; 
            } 
            catch (Exception) 
            { 
                throw; 
            } 
        } 
    } 
 
    public class ClassZip 
    { 
        #region 私有方法 
        /// <summary> 
        /// 递归压缩文件夹方法 
        /// </summary> 
        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; 
        } 
 
        /// <summary> 
        /// 压缩目录 
        /// </summary> 
        /// <param name="FolderToZip">待压缩的文件夹,全路径格式</param> 
        /// <param name="ZipedFile">压缩后的文件名,全路径格式</param> 
        private static bool ZipFileDictory(string FolderToZip, string ZipedFile, int level) 
        { 
            bool res; 
            if (!Directory.Exists(FolderToZip)) 
            { 
                return false; 
            } 
            ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFile)); 
            s.SetLevel(level); 
            res = ZipFileDictory(FolderToZip, s, ""); 
            s.Finish(); 
            s.Close(); 
            return res; 
        } 
 
        /// <summary> 
        /// 压缩文件 
        /// </summary> 
        /// <param name="FileToZip">要进行压缩的文件名</param> 
        /// <param name="ZipedFile">压缩后生成的压缩文件名</param> 
        private static bool ZipFile(string FileToZip, string ZipedFile, int level) 
        { 
            if (!File.Exists(FileToZip)) 
            { 
                throw new System.IO.FileNotFoundException("指定要压缩的文件: " + FileToZip + " 不存在!"); 
            } 
            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); 
                ZipEntry = new ZipEntry(Path.GetFileName(FileToZip)); 
                ZipStream.PutNextEntry(ZipEntry); 
                ZipStream.SetLevel(level); 
 
                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 
 
        /// <summary> 
        /// 压缩 
        /// </summary> 
        /// <param name="FileToZip">待压缩的文件目录</param> 
        /// <param name="ZipedFile">生成的目标文件</param> 
        /// <param name="level">6</param> 
        public static bool Zip(String FileToZip, String ZipedFile, int level) 
        { 
            if (Directory.Exists(FileToZip)) 
            { 
                return ZipFileDictory(FileToZip, ZipedFile, level); 
            } 
            else if (File.Exists(FileToZip)) 
            { 
                return ZipFile(FileToZip, ZipedFile, level); 
            } 
            else 
            { 
                return false; 
            } 
        } 
 
        /// <summary> 
        /// 解压 
        /// </summary> 
        /// <param name="FileToUpZip">待解压的文件</param> 
        /// <param name="ZipedFolder">解压目标存放柯lt;/param> 
        public static void UnZip(string FileToUpZip, string ZipedFolder) 
        { 
            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)); 
                while ((theEntry = s.GetNextEntry()) != null) 
                { 
                    if (theEntry.Name != String.Empty) 
                    { 
                        fileName = Path.Combine(ZipedFolder, theEntry.Name); 
                        if (fileName.EndsWith("/")
上一篇:Not find request .Net FrameWork Data Provider, may be not installed
下一篇:.NET使用OpenSSL生成的pem密钥文件(增加size为2048的密钥转换)