Nén và giải nén sử dụng thư viện SharpZipLib

Hiện có khá nhiều thư viện và component thực hiện việc nén và giải nén trong .net, sharpziplib là một thư viện mã nguồn mở khá dễ sử dụng và ổn định.

Tuy nhiên, lại không có nhiều tài liệu và ví dụ về việc sử dụng thư viện này.
Dưới đây là 2 hàm thông dụng: nén và giả nén với thư viện sharpziplib mà tôi đã sử dụng trong dự án của mình

private static void CompressZip(string sPath) 
{
    ZipOutputStream zipOut  
= new ZipOutputStream(File.Create(@”C:\Temp\test.zip”));
    foreach
(string fName in Directory.GetFiles(sPath))
    {
        FileInfo fi  
= new FileInfo(fName);
        
ZipEntry entry = new ZipEntry(fi.Name);
        
FileStream sReader File.OpenRead(fName);
        byte
[] buff = new byte[Convert.ToInt32(sReader.Length)];
        
sReader.Read(buff, 0, (int) sReader.Length);
        
entry.DateTime fi.LastWriteTime;
        
entry.Size sReader.Length;
        
sReader.Close();
        
zipOut.PutNextEntry(entry);
        
zipOut.Write(buff, 0, buff.Length);
    
}
    zipOut.Finish()
;
    
zipOut.Close();
    
Console.WriteLine(“Done!!”);

private static void UncompressZip(string sFile)
{
    ZipInputStream zipIn 
= new ZipInputStream(File.OpenRead(sFile));
    
ZipEntry entry;
    while 
((entry zipIn.GetNextEntry()) != null)
    {
        FileStream streamWriter 
File.Create(@”C:\Temp\” + entry.Name);
        long 
size entry.Size;
        byte
[] data = new byte[size];
        while 
(true)
        {
            size 
zipIn.Read(data, 0, data.Length);
            if 
(size > 0) streamWriter.Write(data, 0, (int) size);
            else break;
        
}
        streamWriter.Close()
;
    
}
    Console.WriteLine(
“Done!!”);
}

Dưới đây là 3 hàm tôi sử dụng trong thư viện của mình, 2 hàm dùng để nén thư mục (giữ nguyên cấu trúc files và thư mục con, 1 hàm được sử dụng đệ quy để nén các file trong thư mục con), hàm còn lại được sử dụng để giải nén. 2 hàm nén và giải nén sẽ trả về thời gian thực hiện

using System.IO;
using ICSharpCode.SharpZipLib.Zip;

#region public static string CompressFolder(string srcDir, string destZipFile, string filter)

        ///
        /// Compress folder to zip file
        ///
        /// Source folder path
        /// Root folder path
        /// Destination zip file path
        /// Filter (Regular Expression string)
        /// Execution time
        ///
        /// Creator: CuongLT, 2007/08/10, HCM
        ///
        public static string CompressFolder(string srcDir, string destZipFile, string filter)
        {
            DateTime startTime = DateTime.Now;

            ZipOutputStream zos = new ZipOutputStream(File.Create(destZipFile));
            AddFilesFoldersToZip(srcDir, srcDir, filter, ref zos);
            zos.Finish();
            zos.Flush();
            zos.Close();

            DateTime stopTime = DateTime.Now;
            TimeSpan duration = stopTime – startTime;
            string exeTime = duration.TotalMilliseconds.ToString(“F”) + ” ms”;
            return exeTime;
        }

        #endregion

        #region public static void AddFilesFoldersToZip(…)

        ///
        /// Add files and folders (includes subfolders) to zip
        ///
        /// Source directory path
        /// Root directory path
        /// Filter
        /// Zip Output Streem to push files and folders in
        ///
        /// Creator: CuongLT, 2007/08/10, HCM
        /// ===
        /// We use this function recursively, so srcDir is the current Folder need to
        /// add files and subfolders included, and rootDir is the original Folder need
        /// to add to zip stream. We remove rootDir path in srcDir to get the relative
        /// path that specify where files and subfolders located in the zip file.
        ///
        public static void AddFilesFoldersToZip(string srcDir, string rootDir, string filter, ref ZipOutputStream zos)
        {
            #region Add files to zip

            foreach (string fileName in Directory.GetFiles(srcDir, filter))
            {
                zos.SetLevel(9);
                FileInfo fi = new FileInfo(fileName);
                ZipEntry ze = new ZipEntry(srcDir.Remove(0, rootDir.Length) + “/” + fi.Name);
                FileStream fs = File.OpenRead(fileName);
                byte[] buff = new byte[Convert.ToInt32(fs.Length)];
                fs.Read(buff, 0, (int)fs.Length);
                ze.DateTime = fi.LastWriteTime;
                ze.Size = fs.Length;
                fs.Close();
                zos.PutNextEntry(ze);
                zos.Write(buff, 0, buff.Length);
                buff = null;
            }

            #endregion

            #region Add files in subfolders and subfolders to zip (using recurse)

            foreach (string dir in Directory.GetDirectories(srcDir))
            {
                AddFilesFoldersToZip(dir, rootDir, filter, ref zos);
            }

            #endregion
        }

        #endregion

        #region public static string Decompress(string zipFile, string destDir)

        ///
        /// Decompress zip file into destDir directory
        ///
        /// Zip file path
        /// Destination directory path
        /// Execution time
        ///
        /// Creator: CuongLT, 2007/08/10, HCM
        ///
        public static string Decompress(string zipFile, string destDir)
        {
            DateTime startTime = DateTime.Now;

            ZipInputStream zis = new ZipInputStream(File.OpenRead(zipFile));
            ZipEntry ze;
            while ((ze = zis.GetNextEntry()) != null)
            {
                //Create directory contains the file if it doesn’t exist
                string fileName = Path.Combine(destDir, ze.Name);
                FileInfo fi = new FileInfo(fileName);
                if (!Directory.Exists(fi.DirectoryName))
                    Directory.CreateDirectory(fi.DirectoryName);

                //Exact file into the destination directory (and subfolder)
                FileStream writer = File.Create(fileName);
                long size = ze.Size;
                byte[] data = new byte[size];
                while (true)
                {
                    size = zis.Read(data, 0, data.Length);
                    if (size > 0) writer.Write(data, 0, (int)size);
                    else break;
                }
                writer.Close();
            }

            DateTime stopTime = DateTime.Now;
            TimeSpan duration = stopTime – startTime;
            string exeTime = duration.TotalMilliseconds.ToString(“F”) + ” ms”;
            return exeTime;
        }

        #endregion

Tham khảo: Compressing and uncompressing ZIP files

Technorati Tags: , ,

One thought on “Nén và giải nén sử dụng thư viện SharpZipLib

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s