1.前言:
生產的資料日益龐大,舊的歷史資料需要進行壓縮以節省磁碟空間,當有需要查詢時,再透過程式解壓縮後讀取檔案。SharpZipLib是一個GPL License的開放原始碼元件,完全以C#程式開發,提供Zip, GZip, Tar及BZip2等壓縮方式。
2.說明:
SharpZipLib的最新軟體可由下列網址下載:
http://sharpziplib.com/
http://www.icsharpcode.net/opensource/sharpziplib/
本範例使用的版本為0.86.0
解壓縮軟體後,將\SharpZipLib_0860_Bin\net-20\ICSharpCode.SharpZipLib.dll的DLL檔複製到自己專案下的bin目錄
加入參考: ICSharpCode.SharpZipLib.dll
加入命名空間:
using ICSharpCode.SharpZipLib.Zip;
程式碼:
private void btZip_Click(object sender, EventArgs e)
{
string path = @"d:\tmp\test";//要壓縮檔案的目錄路徑
ZipFiles(path, string.Empty, string.Empty);
}
private void btUnzip_Click(object sender, EventArgs e)
{
string path = @"d:\tmp\test1\test.zip";//壓縮檔案路徑
UnZipFiles(path, string.Empty);
}
//讀取目錄下所有檔案
private static ArrayList GetFiles(string path)
{
ArrayList files = new ArrayList();
if (Directory.Exists(path))
{
files.AddRange(Directory.GetFiles(path));
}
return files;
}
//建立目錄
private static void CreateDirectory(string path)
{
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}
///
/// 壓縮檔案
///
///壓縮檔案路徑
///密碼
///註解
private void ZipFiles(string path, string password, string comment)
{
ZipOutputStream zos = null;
try
{
string zipPath = path + @"\" + Path.GetFileName(path) + ".zip";
ArrayList files = GetFiles(path);
zos = new ZipOutputStream(File.Create(zipPath));
if (password != null && password != string.Empty) zos.Password = password;
if (comment != null && comment != "") zos.SetComment(comment);
zos.SetLevel(9);//Compression level 0-9 (9 is highest)
byte[] buffer = new byte[4096];
foreach (string f in files)
{
ZipEntry entry = new ZipEntry(Path.GetFileName(f));
entry.DateTime = DateTime.Now;
zos.PutNextEntry(entry);
FileStream fs = File.OpenRead(f);
int sourceBytes;
do
{
sourceBytes = fs.Read(buffer, 0, buffer.Length);
zos.Write(buffer, 0, sourceBytes);
} while (sourceBytes > 0);
fs.Close();
fs.Dispose();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
zos.Finish();
zos.Close();
zos.Dispose();
}
}
///
/// 解壓縮檔案
///
///解壓縮檔案目錄路徑
///密碼
private void UnZipFiles(string path, string password)
{
ZipInputStream zis = null;
try
{
string unZipPath = path.Replace(".zip", "");
CreateDirectory(unZipPath);
zis = new ZipInputStream(File.OpenRead(path));
if (password != null && password != string.Empty) zis.Password = password;
ZipEntry entry;
while ((entry = zis.GetNextEntry()) != null)
{
string filePath = unZipPath + @"\" + entry.Name;
if (entry.Name != "")
{
FileStream fs = File.Create(filePath);
int size = 2048;
byte[] buffer = new byte[2048];
while (true)
{
size = zis.Read(buffer, 0, buffer.Length);
if (size > 0) { fs.Write(buffer, 0, size); }
else { break; }
}
fs.Close();
fs.Dispose();
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
zis.Close();
zis.Dispose();
}
}
文章標籤
全站熱搜
留言列表

