电脑压缩zip教程(C制作Zip压缩包)

先定义一个枚举,用于程序表示是哪个压缩算法,今天小编就来说说关于电脑压缩zip教程?下面更多详细答案一起来看看吧!

电脑压缩zip教程(C制作Zip压缩包)

电脑压缩zip教程

先定义一个枚举,用于程序表示是哪个压缩算法。

01 /// <summary>

02 /// 压缩枚举

03 /// </summary>

04 public enum ZipEnum

05 {

06 //压缩时间长,压缩率高

07 BZIP2,

08

09 //压缩效率高,压缩率低

10 GZIP

11 }

单个文件的压缩:

01 #region 制作压缩包(单个文件压缩)

02 /// <summary>

03 /// 制作压缩包(单个文件压缩)

04 /// </summary>

05 /// <param name="sourceFileName">原文件</param>

06 /// <param name="zipFileName">压缩文件</param>

07 /// <param name="zipEnum">压缩算法枚举</param>

08 /// <returns>压缩成功标志</returns>

09 public static bool ZipFile(string srcFileName, string zipFileName, ZipEnum zipEnum)

10 {

11 bool flag = true;

12 try

13 {

14 switch (zipEnum)

15 {

16 case ZipEnum.BZIP2:

17

18 FileStream inStream = File.OpenRead(srcFileName);

19 FileStream outStream = File.Open(zipFileName, FileMode.Create);

20

21 //参数true表示压缩完成后,inStream和outStream连接都释放

22 BZip2.Compress(inStream, outStream, true, 4096);

23

24 inStream.Close();

25 outStream.Close();

26

27

28 break;

29 case ZipEnum.GZIP:

30

31 FileStream srcFile = File.OpenRead(srcFileName);

32

33 GZipOutputStream zipFile = newGZipOutputStream(File.Open(zipFileName, FileMode.Create));

34

35 byte[] fileData = new byte[srcFile.Length];

36 srcFile.Read(fileData, 0, (int)srcFile.Length);

37 zipFile.Write(fileData, 0, fileData.Length);

38

39 srcFile.Close();

40 zipFile.Close();

41

42 break;

43 default: break;

44 }

45 }

46 catch

47 {

48 flag = false;

49 }

50 return flag;

51 }

52 #endregion

单个文件的解压缩:

01 #region 解压缩包(单个文件解压缩)

02 /// <summary>

03 /// 解压缩包(单个文件解压缩)

04 /// </summary>

05 /// <param name="zipFileName">压缩文件</param>

06 /// <param name="unzipFileName">解压缩文件</param>

07 /// <param name="zipEnum">压缩算法枚举</param>

08 /// <returns>压缩成功标志</returns>

09 public static bool UnZipFile(string zipFileName, stringunzipFileName, ZipEnum zipEnum)

10 {

11 bool flag = true;

12 try

13 {

14 switch (zipEnum)

15 {

16 case ZipEnum.BZIP2:

17 FileStream inStream = File.OpenRead(zipFileName);

18 FileStream outStream = File.Open(unzipFileName, FileMode.Create);

19 BZip2.Decompress(inStream, outStream, true);

20 break;

21 case ZipEnum.GZIP:

22 GZipInputStream zipFile = newGZipInputStream(File.OpenRead(zipFileName));

23 FileStream destFile = File.Open(unzipFileName, FileMode.Create);

24

25 int bufferSize = 2048 * 2;

26 byte[] fileData = new byte[bufferSize];

27

28 while (bufferSize > 0)

29 {

30 bufferSize = zipFile.Read(fileData, 0, bufferSize);

31 zipFile.Write(fileData, 0, bufferSize);

32 }

33 destFile.Close();

34 zipFile.Close();

35 break;

36 default: break;

37 }

38 }

39 catch

40 {

41 flag = false;

42 }

43 return flag;

44 }

45 #endregion

上面的两个方法在引用了dll后,可以直接使用。

看到这里,相信读者有疑问了,如果我想让多个文件压缩到1个zip包里呢?甚至可以给文件加密?给zip包加注释?

好吧,我这里继续贴两个方法,都经过测试,可用。

制作压缩包

01 #region 制作压缩包(将多个文件压缩到一个压缩包,支持加密、注释)

02 /// <summary>

03 /// 制作压缩包(多个文件压缩到一个压缩包,支持加密、注释)

04 /// </summary>

05 /// <param name="topDirectoryName">压缩文件目录</param>

06 /// <param name="zipedFileName">压缩包文件名</param>

07 /// <param name="compresssionLevel">压缩级别 1-9</param>

08 /// <param name="password">密码</param>

09 /// <param name="comment">注释</param>

10 public static void ZipFiles(string topDirectoryName, string zipedFileName, intcompresssionLevel, string password, string comment)

11 {

12 using (ZipOutputStream zos = newZipOutputStream(File.Open(zipedFileName, FileMode.OpenOrCreate)))

13 {

14 if (compresssionLevel != 0)

15 {

16 zos.SetLevel(compresssionLevel);//设置压缩级别

17 }

18

19 if (!string.IsNullOrEmpty(password))

20 {

21 zos.Password = password;//设置zip包加密密码

22 }

23

24 if (!string.IsNullOrEmpty(comment))

25 {

26 zos.SetComment(comment);//设置zip包的注释

27 }

28

29 //循环设置目录下所有的*.jpg文件(支持子目录搜索)

30 foreach (string file inDirectory.GetFiles(topDirectoryName, "*.jpg", SearchOption.AllDirectories))

31 {

32 if (File.Exists(file))

33 {

34 FileInfo item = new FileInfo(file);

35 FileStream fs = File.OpenRead(item.FullName);

36 byte[] buffer = new byte[fs.Length];

37 fs.Read(buffer, 0, buffer.Length);

38

39 ZipEntry entry = new ZipEntry(item.Name);

40 zos.PutNextEntry(entry);

41 zos.Write(buffer, 0, buffer.Length);

42 }

43 }

44 }

45 }

46 #endregion

解压缩包:

01 #region 解压缩包(将压缩包解压到指定目录)

02 /// <summary>

03 /// 解压缩包(将压缩包解压到指定目录)

04 /// </summary>

05 /// <param name="zipedFileName">压缩包名称</param>

06 /// <param name="unZipDirectory">解压缩目录</param>

07 /// <param name="password">密码</param>

08 public static void UnZipFiles(string zipedFileName, string unZipDirectory, stringpassword)

09 {

10 using (ZipInputStream zis = newZipInputStream(File.Open(zipedFileName, FileMode.OpenOrCreate)))

11 {

12 if (!string.IsNullOrEmpty(password))

13 {

14 zis.Password = password;//有加密文件的,可以设置密码解压

15 }

16

17 ZipEntry zipEntry;

18 while ((zipEntry = zis.GetNextEntry()) != null)

19 {

20 string directoryName = Path.GetDirectoryName(unZipDirectory);

21 string pathName = Path.GetDirectoryName(zipEntry.Name);

22 string fileName = Path.GetFileName(zipEntry.Name);

23

24 pathName = pathName.Replace(".", "$");

25 directoryName = "\\" pathName;

26

27 if (!Directory.Exists(directoryName))

28 {

29 Directory.CreateDirectory(directoryName);

30 }

31

32 if (!string.IsNullOrEmpty(fileName))

33 {

34 FileStream fs = File.Create(Path.Combine(directoryName, fileName));

35 int size = 2048;

36 byte[] bytes = new byte[2048];

37 while (true)

38 {

39 size = zis.Read(bytes, 0, bytes.Length);

40 if (size > 0)

41 {

42 fs.Write(bytes, 0, size);

43 }

44 else

45 {

46 break;

47 }

48 }

49 fs.Close();

50 }

51 }

52 }

53 }

54 #endregion

调用时我们可以这么写:

ZipFileUtil.ZipFiles(@"E:\\test\\", "E:\\test.zip", 1, "admin", "this is admin's comment.");//制作压缩包

ZipFileUtil.UnZipFiles("E:\\test.zip", "E:\\guwei4037\\", "admin");//解压缩包

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页