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文件
然后找到這段
把如上代碼注釋掉,然后編譯,從新引入DLL到項目中就可以了.
轉載于:https://www.cnblogs.com/guowei1027/archive/2010/01/05/1639973.html
總結
以上是生活随笔為你收集整理的c#解压,压缩文件!!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一次批量修改博客文章的经验(下):操作过
- 下一篇: 机构代码是统一社会信用代码吗