且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

C#解压或压缩文件夹

更新时间:2021-09-25 03:25:23

C#解压或压缩文件夹

最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享。
这里主要解决文件夹包含文件夹的解压缩问题。
1)下载SharpZipLib.dll,在http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx中有最新免费版本,“Assembliesfor.NET1.1,.NET2.0,.NETCF1.0,.NETCF2.0:Download[297KB]”点击Download可以下载,解压后里边有好多文件夹,因为不同的版本,我用的FW2.0。
2)引用SharpZipLib.dll,在项目中点击项目右键-->添加引用-->浏览,找到要添加的DLL-->确认
3)改写了文件压缩和解压缩的两个类,新建两个类名字为ZipFloClass.cs,UnZipFloClass.cs
源码如下
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;

usingSystem.IO;

usingICSharpCode.SharpZipLib.Checksums;
usingICSharpCode.SharpZipLib.Zip;
usingICSharpCode.SharpZipLib.GZip;

///<summary>
///ZipFloClass的摘要说明
///</summary>
publicclassZipFloClass
{
publicvoidZipFile(stringstrFile,stringstrZip)
{
if(strFile[strFile.Length-1]!=Path.DirectorySeparatorChar)
strFile
+=Path.DirectorySeparatorChar;
ZipOutputStreams
=newZipOutputStream(File.Create(strZip));
s.SetLevel(
6);//0-storeonlyto9-meansbestcompression
zip(strFile,s,strFile);
s.Finish();
s.Close();
}


privatevoidzip(stringstrFile,ZipOutputStreams,stringstaticFile)
{
if(strFile[strFile.Length-1]!=Path.DirectorySeparatorChar)strFile+=Path.DirectorySeparatorChar;
Crc32crc
=newCrc32();
string[]filenames=Directory.GetFileSystemEntries(strFile);
foreach(stringfileinfilenames)
{

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

else//否则直接压缩文件
{
//打开压缩文件
FileStreamfs=File.OpenRead(file);

byte[]buffer=newbyte[fs.Length];
fs.Read(buffer,
0,buffer.Length);
stringtempfile=file.Substring(staticFile.LastIndexOf("\\")+1);
ZipEntryentry
=newZipEntry(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);
}
}
}

}




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

usingSystem;
usingSystem.Data;
usingSystem.Web;
usingSystem.Text;
usingSystem.Collections;
usingSystem.IO;
usingSystem.Diagnostics;
usingSystem.Runtime.Serialization.Formatters.Binary;

usingICSharpCode.SharpZipLib.BZip2;
usingICSharpCode.SharpZipLib.Zip;
usingICSharpCode.SharpZipLib.Zip.Compression;
usingICSharpCode.SharpZipLib.Zip.Compression.Streams;
usingICSharpCode.SharpZipLib.GZip;
usingICSharpCode.SharpZipLib.Checksums;




///<summary>
///UnZipFloClass的摘要说明
///</summary>
publicclassUnZipFloClass
{

publicstringunZipFile(stringTargetFile,stringfileDir)
{
stringrootFile="";
try
{
//读取压缩文件(zip文件),准备解压缩
ZipInputStreams=newZipInputStream(File.OpenRead(TargetFile.Trim()));
ZipEntrytheEntry;
stringpath=fileDir;
//解压出来的文件保存的路径

stringrootDir="";
//根目录下的第一个子文件夹的名称
while((theEntry=s.GetNextEntry())!=null)
{
rootDir
=Path.GetDirectoryName(theEntry.Name);
//得到根目录下的第一级子文件夹的名称
if(rootDir.IndexOf("\\")>=0)
{
rootDir
=rootDir.Substring(0,rootDir.IndexOf("\\")+1);
}
stringdir=Path.GetDirectoryName(theEntry.Name);
//根目录下的第一级子文件夹的下的文件夹的名称
stringfileName=Path.GetFileName(theEntry.Name);
//根目录下的文件名称
if(dir!="")
//创建根目录下的子文件夹,不限制级别
{
if(!Directory.Exists(fileDir+"\\"+dir))
{
path
=fileDir+"\\"+dir;
//在指定的路径创建文件夹
Directory.CreateDirectory(path);
}
}
elseif(dir==""&&fileName!="")
//根目录下的文件
{
path
=fileDir;
rootFile
=fileName;
}
elseif(dir!=""&&fileName!="")
//根目录下的第一级子文件夹下的文件
{
if(dir.IndexOf("\\")>0)
//指定文件保存的路径
{
path
=fileDir+"\\"+dir;
}
}

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

//以下为解压缩zip文件的基本步骤
//基本思路就是遍历压缩文件里的所有文件,创建一个相同的文件。
if(fileName!=String.Empty)
{
FileStreamstreamWriter
=File.Create(path+"\\"+fileName);

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

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

returnrootFile;
}
catch(Exceptionex)
{
return"1;"+ex.Message;
}
}
}

4)引用,新建一个页面,添加两个按钮,为按钮添加Click事件

源码如下



protectedvoidButton1_Click(objectsender,EventArgse)
{
string[]FileProperties=newstring[2];
FileProperties[
0]="D:\\unzipped\\";//待压缩文件目录
FileProperties[1]="D:\\zip\\a.zip";//压缩后的目标文件
ZipFloClassZc=newZipFloClass();
Zc.ZipFile(FileProperties[
0],FileProperties[1]);

}
protectedvoidButton2_Click(objectsender,EventArgse)
{
string[]FileProperties=newstring[2];
FileProperties[
0]="D:\\zip\\b.zip";//待解压的文件
FileProperties[1]="D:\\unzipped\\";//解压后放置的目标目录
UnZipFloClassUnZc=newUnZipFloClass();
UnZc.unZipFile(FileProperties[
0],FileProperties[1]);
}

5)一切OK,可以测试一下,我是可以运行的。