日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c#解压,压缩文件!!!

發布時間:2024/9/20 C# 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#解压,压缩文件!!! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近要做一個項目涉及到C#中壓縮與解壓縮的問題的解決方法,大家分享。
這里主要解決文件夾包含文件夾的解壓縮問題。
1)下載SharpZipLib.dll,在http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx中有最新免費版本,“Assemblies?for?.NET?1.1,?.NET?2.0,?.NET?CF?1.0,?.NET?CF?2.0:?Download?[297?KB]?”點擊Download可以下載,解壓后里邊有好多文件夾,因為不同的版本,我用的FW2.0。
2)引用SharpZipLib.dll,在項目中點擊項目右鍵-->添加引用-->瀏覽,找到要添加的DLL-->確認
3)改寫了文件壓縮和解壓縮的兩個類,新建兩個類名字為ZipFloClass.cs,UnZipFloClass.cs
源碼如下
using?System;
using?System.Data;
using?System.Configuration;
using?System.Web;
using?System.Web.Security;
using?System.Web.UI;

using?System.IO;

using?ICSharpCode.SharpZipLib.Checksums;
using?ICSharpCode.SharpZipLib.Zip;
using?ICSharpCode.SharpZipLib.GZip;

///?<summary>
///?ZipFloClass?的摘要說明
///?</summary>
public?class?ZipFloClass
{
????
public?void?ZipFile(string?strFile,?string?strZip)
????{
????????
if?(strFile[strFile.Length?-?1]?!=?Path.DirectorySeparatorChar)
????????????strFile?
+=?Path.DirectorySeparatorChar;
????????ZipOutputStream?s?
=?new?ZipOutputStream(File.Create(strZip));
????????s.SetLevel(
6);?//?0?-?store?only?to?9?-?means?best?compression
????????zip(strFile,?s,?strFile);
????????s.Finish();
????????s.Close();
????}


????
private?void?zip(string?strFile,?ZipOutputStream?s,?string?staticFile)
????{
????????
if?(strFile[strFile.Length?-?1]?!=?Path.DirectorySeparatorChar)?strFile?+=?Path.DirectorySeparatorChar;
????????Crc32?crc?
=?new?Crc32();
????????
string[]?filenames?=?Directory.GetFileSystemEntries(strFile);
????????
foreach?(string?file?in?filenames)
????????{

????????????
if?(Directory.Exists(file))
????????????{
????????????????zip(file,?s,?staticFile);
????????????}

????????????
else?//?否則直接壓縮文件
????????????{
????????????????
//打開壓縮文件
????????????????FileStream?fs?=?File.OpenRead(file);

????????????????
byte[]?buffer?=?new?byte[fs.Length];
????????????????fs.Read(buffer,?
0,?buffer.Length);
????????????????
string?tempfile?=?file.Substring(staticFile.LastIndexOf("\\")?+?1);
????????????????ZipEntry?entry?
=?new?ZipEntry(tempfile);

????????????????entry.DateTime?
=?DateTime.Now;
????????????????entry.Size?
=?fs.Length;
????????????????fs.Close();
????????????????crc.Reset();
????????????????crc.Update(buffer);
????????????????entry.Crc?
=?crc.Value;
????????????????s.PutNextEntry(entry);

????????????????s.Write(buffer,?
0,?buffer.Length);
????????????}
????????}
????}

}


?

、、、、、、、、、、、、、、、

using?System;
using?System.Data;
using?System.Web;
using?System.Text;
using?System.Collections;
using?System.IO;
using?System.Diagnostics;
using?System.Runtime.Serialization.Formatters.Binary;

using?ICSharpCode.SharpZipLib.BZip2;
using?ICSharpCode.SharpZipLib.Zip;
using?ICSharpCode.SharpZipLib.Zip.Compression;
using?ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using?ICSharpCode.SharpZipLib.GZip;
using?ICSharpCode.SharpZipLib.Checksums;




///?<summary>
///?UnZipFloClass?的摘要說明
///?</summary>
public?class?UnZipFloClass
{

????
public?string?unZipFile(string?TargetFile,?string?fileDir)
????{
????????
string?rootFile?=?"?";
????????
try
????????{
????????????
//讀取壓縮文件(zip文件),準備解壓縮
????????????ZipInputStream?s?=?new?ZipInputStream(File.OpenRead(TargetFile.Trim()));
????????????ZipEntry?theEntry;
????????????
string?path?=?fileDir;???????????????????
????????????
//解壓出來的文件保存的路徑

????????????
string?rootDir?=?"?";????????????????????????
????????????
//根目錄下的第一個子文件夾的名稱
????????????while?((theEntry?=?s.GetNextEntry())?!=?null)
????????????{
????????????????rootDir?
=?Path.GetDirectoryName(theEntry.Name);??????????????????????????
????????????????
//得到根目錄下的第一級子文件夾的名稱
????????????????if?(rootDir.IndexOf("\\")?>=?0)
????????????????{
????????????????????rootDir?
=?rootDir.Substring(0,?rootDir.IndexOf("\\")?+?1);
????????????????}
????????????????
string?dir?=?Path.GetDirectoryName(theEntry.Name);????????????????????
????????????????
//根目錄下的第一級子文件夾的下的文件夾的名稱
????????????????string?fileName?=?Path.GetFileName(theEntry.Name);????????????????????
????????????????
//根目錄下的文件名稱
????????????????if?(dir?!=?"?"?)????????????????????????????????????????????????????????
????????????????????
//創建根目錄下的子文件夾,不限制級別
????????????????{
????????????????????
if?(!Directory.Exists(fileDir?+?"\\"?+?dir))
????????????????????{
????????????????????????path?
=?fileDir?+?"\\"?+?dir;????????????????????????????????????????????????
????????????????????????
//在指定的路徑創建文件夾
????????????????????????Directory.CreateDirectory(path);
????????????????????}
????????????????}
????????????????
else?if?(dir?==?"?"?&&?fileName?!=?"")??????????????????????????????????????????????
????????????????????
//根目錄下的文件
????????????????{
????????????????????path?
=?fileDir;
????????????????????rootFile?
=?fileName;
????????????????}
????????????????
else?if?(dir?!=?"?"?&&?fileName?!=?"")??????????????????????????????????????????????
????????????????????
//根目錄下的第一級子文件夾下的文件
????????????????{
????????????????????
if?(dir.IndexOf("\\")?>?0)????????????????????????????????????????????????????????????
????????????????????????
//指定文件保存的路徑
????????????????????{
????????????????????????path?
=?fileDir?+?"\\"?+?dir;
????????????????????}
????????????????}

????????????????
if?(dir?==?rootDir)??????????????????????????????????????????????????????????????????????????????????
????????????????????
//判斷是不是需要保存在根目錄下的文件
????????????????{
????????????????????path?
=?fileDir?+?"\\"?+?rootDir;
????????????????}

????????????????
//以下為解壓縮zip文件的基本步驟
????????????????
//基本思路就是遍歷壓縮文件里的所有文件,創建一個相同的文件。
????????????????if?(fileName?!=?String.Empty)
????????????????{
????????????????????FileStream?streamWriter?
=?File.Create(path?+?"\\"?+?fileName);

????????????????????
int?size?=?2048;
????????????????????
byte[]?data?=?new?byte[2048];
????????????????????
while?(true)
????????????????????{
????????????????????????size?
=?s.Read(data,?0,?data.Length);
????????????????????????
if?(size?>?0)
????????????????????????{
????????????????????????????streamWriter.Write(data,?
0,?size);
????????????????????????}
????????????????????????
else
????????????????????????{
????????????????????????????
break;
????????????????????????}
????????????????????}

????????????????????streamWriter.Close();
????????????????}
????????????}
????????????s.Close();

????????????
return?rootFile;
????????}
????????
catch?(Exception?ex)
????????{
????????????
return?"1;?"?+?ex.Message;
????????}
????}???
}

4)引用,新建一個頁面,添加兩個按鈕,為按鈕添加Click事件

源碼如下

?

?
protected?void?Button1_Click(object?sender,?EventArgs?e)
????{
????????
string[]?FileProperties?=?new?string[2];
????????FileProperties[
0]?=?"D:\\unzipped\\";//待壓縮文件目錄
????????FileProperties[1]?=?"D:\\zip\\a.zip";??//壓縮后的目標文件
????????ZipFloClass?Zc?=?new?ZipFloClass();
????????Zc.ZipFile(FileProperties[
0],?FileProperties[1]);

????}
????
protected?void?Button2_Click(object?sender,?EventArgs?e)
????{
????????
string[]?FileProperties?=?new?string[2];
????????FileProperties[
0]?=?"D:\\zip\\b.zip";//待解壓的文件
????????FileProperties[1]?=?"D:\\unzipped\\";//解壓后放置的目標目錄
????????UnZipFloClass?UnZc?=?new?UnZipFloClass();
????????UnZc.unZipFile(FileProperties[
0],?FileProperties[1]);
????}

?

?

在解壓縮的時候會出現一個問題:size mismatch: XXXXXXX
有個辦法,我還沒仔細看,但是有效:
打開SharpZipLib源代碼,你找到ZIP文件夾下的,ZipInputStream.cs文件
然后找到這段

  • if ((flags & 8) == 0 && (inf.TotalIn != csize || inf.TotalOut != size)) {
  • ?? ? throw new ZipException("Size mismatch: " + csize + ";" + size + " <-> " + inf.TotalIn + ";" + inf.TotalOut);
  • }
  • 把如上代碼注釋掉,然后編譯,從新引入DLL到項目中就可以了.

    轉載于:https://www.cnblogs.com/guowei1027/archive/2010/01/05/1639973.html

    總結

    以上是生活随笔為你收集整理的c#解压,压缩文件!!!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。