這個功能完全依靠一個第三方的類,ICSharpCode.SharpZipLib.dll,只是在網上搜了大半天,都沒有關於這個類的詳細解釋,搜索的demo也是各種錯誤,感覺作者完全沒有跑過,就那麼貿貿然的貼出來了。當然這個功能的實現也是基於前人的Demo,感恩!
我創建的是個Windows窗體應用程序取名為ZipDemo。
2個文本框,4個按鈕
ICSharpCode.SharpZipLib.dll
3. 壓縮的代碼
//選擇文件夾
private void btnOpen_Click(object sender, EventArgs e)
{
FolderBrowserDialog dialog = new FolderBrowserDialog();//打開文件夾
if (dialog.ShowDialog() != DialogResult.OK)
{
return;
}
txtPath.Text = dialog.SelectedPath;
}
//開始壓縮
private void btnZip3_Click(object sender, EventArgs e)
{
ZipOutputStream zipStream = new ZipOutputStream(File.Create(Path.GetFileName(txtPath.Text) + ".zip"));//壓縮到Debug中
AddZip3(txtPath.Text, ref zipStream);
zipStream.Finish();
zipStream.Close();
MessageBox.Show("壓縮完成");
}
//遞歸壓縮
void AddZip3(string path, ref ZipOutputStream zipStream)
{
//如果是文件,則壓縮
if (File.Exists(path))
{
zipStream.SetLevel(9); //壓縮等級
FileStream f = File.OpenRead(path);
byte[] b = new byte[f.Length];
f.Read(b, 0, b.Length); //將文件流加入緩衝字節中
string filePath = path.Replace(txtPath.Text, string.Empty).Remove(0, 1);//取相對路徑,並且去掉前面的/,否則壓縮的文件和文件夾名稱前都會加個/
ZipEntry z = new ZipEntry(filePath);//如果是文件夾下的文件,會自動創建文件夾
zipStream.PutNextEntry(z); //為壓縮文件流提供一個容器
zipStream.Write(b, 0, b.Length); //寫入字節
f.Close();
}
//如果是文件夾,則循環裏面的文件和文件夾
if (Directory.Exists(path))
{
DirectoryInfo di = new DirectoryInfo(path);
foreach (var item in di.GetDirectories())
{
AddZip3(item.FullName, ref zipStream);
}
foreach (var item in di.GetFiles())
{
AddZip3(item.FullName, ref zipStream);
}
}
}
壓縮
4. 解壓縮的代碼
//選擇文件
private void btnOpenFile_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() != DialogResult.OK)
{
return;
}
txtFile.Text = ofd.FileName;
}
private void btnUnZip_Click(object sender, EventArgs e)
{
string path = txtFile.Text;
string un_dir = Path.GetFileNameWithoutExtension(path);//文件的名稱
Directory.CreateDirectory(un_dir); //創建以壓縮包為名稱的文件夾
ZipInputStream f = new ZipInputStream(File.OpenRead(path)); //讀取壓縮文件,並用此文件流新建 “ZipInputStream”對象
ZipEntry zp; //獲取解壓文件流中的項目
while ((zp = f.GetNextEntry()) != null)//循環讀取每個文件
{
string filePath = Path.Combine(un_dir, zp.Name);
string dirPath = Path.GetDirectoryName(filePath);
if (!zp.IsDirectory && zp.Crc != 00000000L) //此“ZipEntry”不是“標記文件”
{
int i = 2048 *2;
byte[] b = new byte[i]; //每次緩衝 2048*2 字節
if (!Directory.Exists(dirPath))//存在子文件夾,必須先創建文件夾,否則會報錯,無法自動創建文件夾
{
Directory.CreateDirectory(dirPath);
}
FileStream s = File.Create(filePath); //新建文件流
while (true) //持續讀取字節,直到一個“ZipEntry”字節讀完
{
i = f.Read(b, 0, b.Length); //讀取“ZipEntry”中的字節
if (i > 0)
{
s.Write(b, 0, i); //將字節寫入新建的文件流
}
else
{
break; //讀取的字節為 0 ,跳出循環
}
}
s.Close();
}
}
MessageBox.Show("解壓縮OK");
}
解壓縮
這個Demo是跑過的,Demo壓縮的文件WinRAR是可以打開,其他Zip壓縮文件Demo也是可以解壓縮的。
如果發現解壓縮報錯的話,先看看,解壓縮的文件是不是zip格式。
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。