星期四, 4月 10, 2008

Compression and Decompression of Files(C#)

今天遇到一個問題..就是要壓縮備份資料庫的mdb..google找了一些文章..用asp.net去試了一下..參考小喵的文章
http://blog.blueshop.com.tw/topcat/archive/2008/02/04/54267.aspx

寫出一組的class..因為小喵的是用vb寫的..我就把我的C#版丟出來..大家有需要去用ㄟ..

public class Compressor
{
/// <summary>
/// 壓縮資料夾
/// </summary>
/// <param name="originalFile">被壓縮的資料夾名稱</param>
/// <param name="compressedFile">壓縮後的名稱</param>
public void CompressDirectory(string originalFile, string compressedFile)
{
if (!Directory.Exists(originalFile))
throw new Exception(string.Format("{0}資料夾位置錯誤", originalFile));
try
{
//開始壓縮
new FastZip().CreateZip(compressedFile, originalFile, true, "");
}
catch
{
throw new Exception("處理壓縮錯誤");
}
}
/// <summary>
/// 壓縮檔案,檔名為時間戳記
/// </summary>
/// <param name="originalFile">被壓縮的檔案名稱</param>
public void CompressFile(string originalFile)
{
//加入時間戳記
string newFileName = string.Format(@"{0}{1:_yyyyMMdd_hhmmss}.zip",
Path.GetFileNameWithoutExtension(originalFile), DateTime.Now);
string target = originalFile.Replace(Path.GetFileName(originalFile), newFileName);
CompressFile(originalFile, target);
}
/// <summary>
/// 壓縮檔案
/// </summary>
/// <param name="originalFile">被壓縮的檔案</param>
/// <param name="compressedFile">壓縮後的名稱</param>
public void CompressFile(string originalFile, string compressedFile)
{
if (!File.Exists(originalFile))
throw new Exception(string.Format("{0}檔案位置錯誤", originalFile));
try
{
using (ZipOutputStream zo = new ZipOutputStream(File.Create(compressedFile)))
using (FileStream fs = File.OpenRead(originalFile))
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);

ZipEntry entry = new ZipEntry(Path.GetFileName(originalFile));
//Entry.ForceZip64();//檔案大於4G時使用
entry.DateTime = DateTime.Now;
entry.Size = fs.Length;

zo.SetLevel(9);
zo.PutNextEntry(entry);
zo.Write(buffer, 0, buffer.Length);
zo.Finish();
}
}
catch
{
throw new Exception("檔案壓縮錯誤");
}
}
/// <summary>
/// 解壓縮檔案
/// </summary>
/// <param name="compressedFile">被解壓縮的檔案名稱</param>
/// <param name="decompressedFile">解壓縮後的資料夾名稱</param>
public void DecompressFile(string compressedFile, string decompressedFile)
{
if (!File.Exists(compressedFile))
throw new Exception(string.Format("{0}檔案位置錯誤", compressedFile));
try
{
//開始解壓縮
new ICSharpCode.SharpZipLib.Zip.FastZip().ExtractZip(compressedFile, decompressedFile, "");
}
catch
{
throw new Exception("檔案解壓縮錯誤");
}
}
}

不過測試結果..壓縮ICSharpCode.SharpZipLib壓縮解壓縮真的有點慢..不知道試我用隨身碟..還是因為我電腦慢的關西..Disappointed..有任何問題..留言一下ㄅ..Nerd..

ps:記得還是要去這網站下載ICSharpCode.SharpZipLib.dll這東西ㄟ..才可以跑..

---20080915更新class..因為之前寫得很爛..XD..---

2 則留言:

林起司 提到...

mm~~
霧颯颯..看無..

阿睪已經晉級到我這輩子追不到的境界了

睪哥有你的~~

irone 提到...

請問你是在Window Form中使用嗎??
我實驗後的結果是,它抓到了我所選的folder的下一層所有檔案和folder
卻沒壓縮起來?