先定义一个枚举,用于程序表示是哪个压缩算法。
01///<summary
02///压缩枚举
03///</summary
04publicenumZipEnum
05{
06//压缩时间长,压缩率高
07BZIP2,
08
09//压缩效率高,压缩率低
10GZIP
11}
单个文件的压缩:
01#region制作压缩包(单个文件压缩)
02///<summary
03///制作压缩包(单个文件压缩)
04///</summary
05///<paramname="sourceFileName"原文件</param
06///<paramname="zipFileName"压缩文件</param
07///<paramname="zipEnum"压缩算法枚举</param
08///<returns压缩成功标志</returns
09publicstaticboolZipFile(stringsrcFileName,stringzipFileName,ZipEnumzipEnum)
10{
11boolflag=true;
12try
13{
14switch(zipEnum)
15{
16caseZipEnum.BZIP2:
17
18FileStreaminStream=File.OpenRead(srcFileName);
19FileStreamoutStream=File.Open(zipFileName,FileMode.Create);
20
21//参数true表示压缩完成后,inStream和outStream连接都释放
22BZip2.Compress(inStream,outStream,true,4096);
23
24inStream.Close();
25outStream.Close();
26
27
28break;
29caseZipEnum.GZIP:
30
31FileStreamsrcFile=File.OpenRead(srcFileName);
32
33GZipOutputStreamzipFile=newGZipOutputStream(File.Open(zipFileName,FileMode.Create));
34
35byte[]fileData=newbyte[srcFile.Length];
36srcFile.Read(fileData,0,(int)srcFile.Length);
37zipFile.Write(fileData,0,fileData.Length);
38
39srcFile.Close();
40zipFile.Close();
41
42break;
43default:break;
44}
45}
46catch
47{
48flag=false;
49}
50returnflag;
51}
52#endregion
单个文件的解压缩:
01#region解压缩包(单个文件解压缩)
02///<summary
03///解压缩包(单个文件解压缩)
04///</summary
05///<paramname="zipFileName"压缩文件</param
06///<paramname="unzipFileName"解压缩文件</param
07///<paramname="zipEnum"压缩算法枚举</param
08///<returns压缩成功标志</returns
09publicstaticboolUnZipFile(stringzipFileName,stringunzipFileName,ZipEnumzipEnum)
10{
11boolflag=true;
12try
13{
14switch(zipEnum)
15{
16caseZipEnum.BZIP2:
17FileStreaminStream=File.OpenRead(zipFileName);
18FileStreamoutStream=File.Open(unzipFileName,FileMode.Create);
19BZip2.Decompress(inStream,outStream,true);
20break;
21caseZipEnum.GZIP:
22GZipInputStreamzipFile=newGZipInputStream(File.OpenRead(zipFileName));
23FileStreamdestFile=File.Open(unzipFileName,FileMode.Create);
24
25intbufferSize=2048*2;
26byte[]fileData=newbyte[bufferSize];
27
28while(bufferSize0)
29{
30bufferSize=zipFile.Read(fileData,0,bufferSize);
31zipFile.Write(fileData,0,bufferSize);
32}
33destFile.Close();
34zipFile.Close();
35break;
36default:break;
37}
38}
39catch
40{
41flag=false;
42}
43returnflag;
44}
45#endregion
上面的两个方法在引用了dll后,可以直接使用。
看到这里,相信读者有疑问了,如果我想让多个文件压缩到1个zip包里呢?甚至可以给文件加密?给zip包加注释?
好吧,我这里继续贴两个方法,都经过测试,可用。
制作压缩包
01#region制作压缩包(将多个文件压缩到一个压缩包,支持加密、注释)
02///<summary
03///制作压缩包(多个文件压缩到一个压缩包,支持加密、注释)
04///</summary
05///<paramname="topDirectoryName"压缩文件目录</param
06///<paramname="zipedFileName"压缩包文件名</param
07///<paramname="compresssionLevel"压缩级别1-9</param
08///<paramname="password"密码</param
09///<paramname="comment"注释</param
10publicstaticvoidZipFiles(stringtopDirectoryName,stringzipedFileName,intcompresssionLevel,stringpassword,stringcomment)
11{
12using(ZipOutputStreamzos=newZipOutputStream(File.Open(zipedFileName,FileMode.OpenOrCreate)))
13{
14if(compresssionLevel!=0)
15{
16zos.SetLevel(compresssionLevel);//设置压缩级别
17}
18
19if(!string.IsNullOrEmpty(password))
20{
21zos.Password=password;//设置zip包加密密码
22}
23
24if(!string.IsNullOrEmpty(comment))
25{
26zos.SetComment(comment);//设置zip包的注释
27}
28
29//循环设置目录下所有的*.jpg文件(支持子目录搜索)
30foreach(stringfileinDirectory.GetFiles(topDirectoryName,"*.jpg",SearchOption.AllDirectories))
31{
32if(File.Exists(file))
33{
34FileInfoitem=newFileInfo(file);
35FileStreamfs=File.OpenRead(item.FullName);
36byte[]buffer=newbyte[fs.Length];
37fs.Read(buffer,0,buffer.Length);
38
39ZipEntryentry=newZipEntry(item.Name);
40zos.PutNextEntry(entry);
41zos.Write(buffer,0,buffer.Length);
42}
43}
44}
45}
46#endregion
解压缩包:
01#region解压缩包(将压缩包解压到指定目录)
02///<summary
03///解压缩包(将压缩包解压到指定目录)
04///</summary
05///<paramname="zipedFileName"压缩包名称</param
06///<paramname="unZipDirectory"解压缩目录</param
07///<paramname="password"密码</param
08publicstaticvoidUnZipFiles(stringzipedFileName,stringunZipDirectory,stringpassword)
09{
10using(ZipInputStreamzis=newZipInputStream(File.Open(zipedFileName,FileMode.OpenOrCreate)))
11{
12if(!string.IsNullOrEmpty(password))
13{
14zis.Password=password;//有加密文件的,可以设置密码解压
15}
16
17ZipEntryzipEntry;
18while((zipEntry=zis.GetNextEntry())!=null)
19{
20stringdirectoryName=Path.GetDirectoryName(unZipDirectory);
21stringpathName=Path.GetDirectoryName(zipEntry.Name);
22stringfileName=Path.GetFileName(zipEntry.Name);
23
24pathName=pathName.Replace(".","$");
25directoryName+="\\"+pathName;
26
27if(!Directory.Exists(directoryName))
28{
29Directory.CreateDirectory(directoryName);
30}
31
32if(!string.IsNullOrEmpty(fileName))
33{
34FileStreamfs=File.Create(Path.Combine(directoryName,fileName));
35intsize=2048;
36byte[]bytes=newbyte[2048];
37while(true)
38{
39size=zis.Read(bytes,0,bytes.Length);
40if(size0)
41{
42fs.Write(bytes,0,size);
43}
44else
45{
46break;
47}
48}
49fs.Close();
50}
51}
52}
53}
调用时我们可以这么写:
本文来自“无人街七号”用户投稿,该文观点仅代表作者本人,不代表华夏信息网立场,本站不对文章中的任何观点负责,内容版权归原作者所有、内容只用于提供信息阅读,无任何商业用途。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站(文章、内容、图片、音频、视频)有涉嫌抄袭侵权/违法违规的内容,请发送邮件至1470280261#qq.com举报,一经查实,本站将立刻删除、维护您的正当权益。如若转载,请注明出处:http://www.xxxwhg.com/zh/96309.html