IT
最近要做一个项目涉及到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

}

posted on 2010-06-28 12:18  liufei  阅读(364)  评论(0编辑  收藏  举报