這個功能完全依靠一個第三方的類,ICSharpCode.SharpZipLib.dll,只是在網上搜了大半天,都沒有關於這個類的詳細解釋,搜索的demo也是各種錯誤,感覺作者完全沒有跑過,就那麼貿貿然的貼出來了。當然這個功能的實現也是基於前人的Demo,感恩!

我創建的是個Windows窗體應用程序取名為ZipDemo。

 

2個文本框,4個按鈕

demo加解密在線_Click

ICSharpCode.SharpZipLib.dll

  3. 壓縮的代碼

demo加解密在線_Text_02

demo加解密在線_Click_03

//選擇文件夾
        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. 解壓縮的代碼

demo加解密在線_解壓縮_04

demo加解密在線_解壓縮_05

//選擇文件
        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格式。