Trong phần này sẽ giới thiệu thư
viện DLL ICSharpCode.SharpZipLib. Đây là thư viện được tạo ra giúp chúng ta dễ
dàng thao tác với tạo và giải nén file zip. Thư viện này đã có trong thư mục mã
nguồn ở cuối trang.
Ví
dụ:
Ta có 1 folder tên là “Tep” ở cùng thư mục
chương trình, và 1 file zip có tên là gianen.zip với password là “12345”, viết
chương trình có 2 nút lệnh, 1 nút là nén folder
“Tep” thành file zip với tên là danen.zip và password là “6789” lưu vào ổ D, 1
nút là giải nén file zip giainen.zip lưu vào ổ D.
Code:
Ta tạo 1 ứng dụng WindowsForm với
2 nút Button là “Nén file” và “Giải nén file”. Và ta Add Reference thư viện ICSharpCode.SharpZipLib.dll
vào trong Project vừa tạo (Add bằng cách ở thanh menu chọn Project -> Add
Reference -> Chuyển sang tab Browse và tìm đến thư viện đó).
Sau khi Add thư viện xong ta tiến
hành viết code. Ta có 2 hàm quan trọng là CreateSample(tạo
file zip) và ExtractZipFile(giải nén).
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
//Khai
báo sử dụng thư viện ICSharpCode.SharpZipLib.dll
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Core;
namespace Zipfile
{
public partial class Form1 : Form
{
public
Form1()
{
InitializeComponent();
}
#region///Hàm tạo file
nén create zip có pass
public void CreateSample(string
outPathname, string password, string folderName)
//outPathname:
tên và đường dẫn lưu kết quả (ví dụ tên là ketqua.zip lưu ổ E,
"E:\\ketqua.zip")
//password: là
password thiết lập cho file zip (ví dụ pass là "12345")
//folderName:
là đường dẫn folder dữ liệu (ví dụ có folder "data" ở ổ C,
"C:\\data")
//CreateSample("C:\\ketqua.zip",
"12345", "C:\\data");
//Chú ý nếu
ketqua.zip đã tồn tại trong ổ E thì cần phải xóa bỏ file này thì mới tạo được
{
FileStream
fsOut = File.Create(outPathname);
ZipOutputStream
zipStream = new ZipOutputStream(fsOut);
zipStream.SetLevel(3); //0-9,có 9 mức nén, mức 9 là cao nhất
zipStream.Password = password;
int
folderOffset = folderName.Length + (folderName.EndsWith("\\") ? 0 : 1);
CompressFolder(folderName, zipStream,
folderOffset);
zipStream.IsStreamOwner = true;
zipStream.Close();
}
private
void CompressFolder(string
path, ZipOutputStream zipStream, int folderOffset)
{
string[]
files = Directory.GetFiles(path);
foreach
(string filename in
files)
{
FileInfo
fi = new FileInfo(filename);
string
entryName = filename.Substring(folderOffset);
entryName = ZipEntry.CleanName(entryName);
ZipEntry
newEntry = new ZipEntry(entryName);
newEntry.DateTime =
fi.LastWriteTime;
newEntry.Size = fi.Length;
zipStream.PutNextEntry(newEntry);
byte[]
buffer = new byte[4096];
using
(FileStream streamReader = File.OpenRead(filename))
{
StreamUtils.Copy(streamReader,
zipStream, buffer);
}
zipStream.CloseEntry();
}
string[]
folders = Directory.GetDirectories(path);
foreach
(string folder in
folders)
{
CompressFolder(folder,
zipStream, folderOffset);
}
}
#endregion
#region///Hàm giải nén
file zip có password
public void ExtractZipFile(string
archiveFilenameIn, string password, string outFolder)
//archiveFilenameIn:
đường dẫn file zip (ví dụ trong ổ E có file zip là ketqua.zip,
"E:\\ketqua.zip")
//password: là
password đã đặt cho file zip như ví dụ trên là ketqua.zip(ví dụ
"12345678")
//outFolder: đường
dẫn folder lưu kết quả giải nén (ví dụ trong ổ C có thư mục là data,
"C:\\data")
//ExtractZipFile("E:\\ketqua.zip","12345678","C:\\data")
{
ZipFile
zf = null;
try
{
FileStream
fs = File.OpenRead(archiveFilenameIn);
zf = new
ZipFile(fs);
if
(!String.IsNullOrEmpty(password))
{
zf.Password = password;
}
foreach
(ZipEntry zipEntry in
zf)
{
if
(!zipEntry.IsFile)
{
continue;
}
String
entryFileName = zipEntry.Name;
byte[]
buffer = new byte[4096];
Stream
zipStream = zf.GetInputStream(zipEntry);
String
fullZipToPath = Path.Combine(outFolder,
entryFileName);
string
directoryName = Path.GetDirectoryName(fullZipToPath);
if
(directoryName.Length > 0)
Directory.CreateDirectory(directoryName);
if
(System.IO.File.Exists(fullZipToPath) != true)
{
using (FileStream streamWriter
= File.Create(fullZipToPath))
{
StreamUtils.Copy(zipStream, streamWriter, buffer);
}
}
else
{
using (FileStream streamWriter
= new FileStream(fullZipToPath,
FileMode.Append))
{
StreamUtils.Copy(zipStream, streamWriter, buffer);
}
}
}
}
finally
{
if
(zf != null)
{
zf.IsStreamOwner = true;
zf.Close();
}
}
}
#endregion
//Button Nén
file thành file Zip
private
void button2_Click(object
sender, EventArgs e)
{
//Lấy đường
dẫn file Tep.txt để cùng với thư mục chương trình
string
folderName = Path.GetDirectoryName(Application.ExecutablePath) + "\\Tep";
//MessageBox.Show(folderName);
CreateSample("E:\\danen.zip", "12345", folderName);
MessageBox.Show("Đã nén thành công", "Thông báo");
}
//Button Giải
nén
private
void button3_Click(object
sender, EventArgs e)
{
ExtractZipFile(Path.GetDirectoryName(Application.ExecutablePath)
+ "\\giainen.zip", "6789", "E:\\giainen");
MessageBox.Show("Đã giải nén thành công", "Thông báo");
}
}
}
Giao diện chương trình khi chạy
Giao diện chương trình khi chạy
Hãy like nếu bài viết có ích →
Kết bạn với gisgpsrs trên Facebook
để nhận bài viết mới nóng hổi
Không có nhận xét nào:
Đăng nhận xét