zoukankan      html  css  js  c++  java
  • 文件压缩与解压

    1.文件压缩事件

     private void button1_Click(object sender, EventArgs e)
            {
                string[] FileProperties = new string[2];
                FileProperties[0] = @"F:sssd";//待压缩文件目录
                FileProperties[1] = @"F:sssd\三国人物.zip";  //压缩后的目标文件
                ZipClass Zc = new ZipClass();
                Zc.ZipFileMain(FileProperties);
                ZipClass.Zip(FileProperties[0], FileProperties[1]);
                
            }

    2.文件解压事件

     private void button2_Click(object sender, EventArgs e)
            {
                string[] FileProperties = new string[2];
                FileProperties[0] = @"F:sssd\三国人物.zip";//待解压的文件
                FileProperties[1] = @"F:sssd";//解压后放置的目标目录
                UnZipClass UnZc = new UnZipClass();
                UnZc.UnZip(FileProperties);
    
            }
    View Code

    3.ZipClass.cs(处理压缩文件类)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using ICSharpCode.SharpZipLib.Zip;
    using System.IO;
    using ICSharpCode.SharpZipLib.Checksums;
    using System.Net.Mail;
    using System.Net;
    
    
    namespace 压缩和解压缩
    {
        public class ZipClass
        {
    
            public void ZipFile(string FileToZip, string ZipedFile, int CompressionLevel, int BlockSize)
            {
                //如果文件没有找到,则报错
                if (!System.IO.File.Exists(FileToZip))
                {
                    throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
                }
    
                System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read);
                System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
                ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
                ZipEntry ZipEntry = new ZipEntry("ZippedFile");
                ZipStream.PutNextEntry(ZipEntry);
                ZipStream.SetLevel(CompressionLevel);
                byte[] buffer = new byte[BlockSize];
                System.Int32 size = StreamToZip.Read(buffer, 0, buffer.Length);
                ZipStream.Write(buffer, 0, size);
                try
                {
                    while (size < StreamToZip.Length)
                    {
                        int sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);
                        ZipStream.Write(buffer, 0, sizeRead);
                        size += sizeRead;
                    }
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }
                ZipStream.Finish();
                ZipStream.Close();
                StreamToZip.Close();
            }
    
            public void ZipFileMain(string[] args)
            {
                string[] filenames = Directory.GetFiles(args[0]);
    
                Crc32 crc = new Crc32();
                ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));
    
                s.SetLevel(6); // 0 - store only to 9 - means best compression
    
                foreach (string file in filenames)
                {
                    //打开压缩文件
                    FileStream fs = File.OpenRead(file);
    
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    ZipEntry entry = new ZipEntry(file);
    
                    entry.DateTime = DateTime.Now;
    
                    // set Size and the crc, because the information
                    // about the size and crc should be stored in the header
                    // if it is not set it is automatically written in the footer.
                    // (in this case size == crc == -1 in the header)
                    // Some ZIP programs have problems with zip files that don't store
                    // the size and crc in the header.
                    entry.Size = fs.Length;
                    fs.Close();
    
                    crc.Reset();
                    crc.Update(buffer);
    
                    entry.Crc = crc.Value;
    
                    s.PutNextEntry(entry);
    
                    s.Write(buffer, 0, buffer.Length);
    
                }
    
                s.Finish();
                s.Close();
            }
            /**/
            /// <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();
                 }
     
     
                 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>
            /// <returns></returns>
            private static bool ZipFileDictory(string FolderToZip, string ZipedFile)
            {
                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>
            /// <returns></returns>
            private static bool ZipFile(string FileToZip, string ZipedFile)
            {
                //如果文件没有找到,则报错
                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();
                }
    
                return res;
            }
    
            /**/
            /// <summary>
            /// 压缩文件 和 文件夹
            /// </summary>
            /// <param name="FileToZip">待压缩的文件或文件夹,全路径格式</param>
            /// <param name="ZipedFile">压缩后生成的压缩文件名,全路径格式</param>
            /// <returns></returns>
            public static bool Zip(String FileToZip, String ZipedFile)
            {
                if (Directory.Exists(FileToZip))
                {
                    return ZipFileDictory(FileToZip, ZipedFile);
                }
                else if (File.Exists(FileToZip))
                {
                    return ZipFile(FileToZip, ZipedFile);
                }
                else
                {
                    return false;
                }
            }
           
        }
    }
    View Code

    4.UnZipClass.cs(处理解压的文件类)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using ICSharpCode.SharpZipLib.Zip;
    using System.IO;
    
    namespace 压缩和解压缩
    {
        public class UnZipClass
        {
            public void UnZip(string[] args)
            {
                ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));
    
                ZipEntry theEntry;
                while ((theEntry = s.GetNextEntry()) != null)
                {
    
                    string directoryName = Path.GetDirectoryName(args[1]);
                    string fileName = Path.GetFileName(theEntry.Name);
    
                    //生成解压目录
                    Directory.CreateDirectory(directoryName);
    
                    if (fileName != String.Empty)
                    {
                        //解压文件到指定的目录
                        FileStream streamWriter = File.Create(args[1] + 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();
            }
            /**/
            /// <summary>
            /// 解压功能(解压压缩文件到指定目录)
            /// </summary>
            /// <param name="FileToUpZip">待解压的文件</param>
            /// <param name="ZipedFolder">指定解压目标目录</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));
                   // 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);
                }
            }
        }
    }
    View Code
  • 相关阅读:
    Pig设计模式概要以及与SQL的设计模式的对比
    Pig设计模式概要以及与SQL的设计模式的对比
    ArcGIS API for Silverlight 学习笔记
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/zxbzl/p/3675322.html
Copyright © 2011-2022 走看看