zoukankan      html  css  js  c++  java
  • SharpZipLib压缩文件夹及文件

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

    /*
    * 解压缩
    * 该程序压缩和解压配合才能使用
    * 普通用 Winrar 压缩的文件该解压不能通过
    */

    namespace SharpZipLib
    {
        
    /// 
        
    /// 压缩类
        
    /// 

        public class ZipClass
        
    {
            
    /// 
            
    /// 递归压缩文件夹方法
            
    /// 
            
    /// 
            
    /// 
            
    /// 

            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;
            }


            
    /// 
            
    /// 压缩目录
            
    /// 
            
    /// 待压缩的文件夹,全路径格式
            
    /// 压缩后的文件名,全路径格式
            
    /// 

            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);
                s.Password 
    = Password;

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

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

                
    return res;
            }


            
    /// 
            
    /// 压缩文件
            
    /// 
            
    /// 要进行压缩的文件名
            
    /// 压缩后生成的压缩文件名
            
    /// 

            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);
                    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;
            }


            
    /// 
            
    /// 压缩文件 和 文件夹
            
    /// 
            
    /// 待压缩的文件或文件夹,全路径格式
            
    /// 压缩后生成的压缩文件名,全路径格式
            
    /// 

            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;
                }

            }

        }

        
    /// 
        
    /// 解压类
        
    /// 

        public class UnZipClass
        
    {
            
    /// 
            
    /// 解压功能(解压压缩文件到指定目录)
            
    /// 
            
    /// 待解压的文件
            
    /// 指定解压目标目录

            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);
                }

            }

        }

    }

  • 相关阅读:
    非Ajax实现客户端的异步调用
    转:IE7远程客户端本地预览图片的解决办法(兼容IE6)
    How to Persist With Your Goals When the Going Gets Tough 编程爱好者
    How to Persist When You Really Want to Quit 编程爱好者
    JAVA环境变量设置
    手机连接WIFI总掉线的解决方法
    servlet中web.xml配置详解(转)
    ArrayList的contains方法[转]
    eclipse下 alt+/快捷键方式失效的解决
    关于数据结构,关于算法,关于hash桶算法
  • 原文地址:https://www.cnblogs.com/bobofsj11/p/1234679.html
Copyright © 2011-2022 走看看