ICSharpCode.SharpZipLib

作者:追风剑情 发布于:2017-8-30 11:28 分类:C#

  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using ICSharpCode.SharpZipLib.Zip;
  5.  
  6. namespace SharpZipLibTest
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. string cur_path = Directory.GetCurrentDirectory();
  13. string res_path = Directory.GetCurrentDirectory() + "/res";
  14. string zip_path = Directory.GetCurrentDirectory() + "/res.zip";
  15. string unzip_path = Directory.GetCurrentDirectory() + "/unzip_res";
  16.  
  17. Console.WriteLine("要压缩的资源目录: " + res_path);
  18. Console.WriteLine("压缩后的文件名: "+zip_path);
  19.  
  20. ZipHelp.Compress(res_path, zip_path);
  21. ZipHelp.UnCompress(zip_path, unzip_path);
  22.  
  23. Console.WriteLine("完成!");
  24. Console.Read();
  25. }
  26. }
  27.  
  28. /// <summary>
  29. /// Zip辅助类
  30. /// </summary>
  31. public class ZipHelp
  32. {
  33. /// <summary>
  34. /// 压缩
  35. /// </summary>
  36. /// <param name="fileOrDir">要压缩的文件或文件夹路径</param>
  37. /// <param name="savePath">要保存的文件名</param>
  38. public static void Compress(string fileOrDir, string savePath)
  39. {
  40. if (Path.HasExtension(fileOrDir))
  41. CompressFile(fileOrDir, savePath);
  42. else
  43. CompressDirectory(fileOrDir, savePath);
  44. }
  45.  
  46. /// <summary>
  47. /// 解压
  48. /// </summary>
  49. /// <param name="zipPath">zip文件所在路径</param>
  50. /// <param name="savePath">解压后要存放的目录</param>
  51. public static void UnCompress(string zipPath, string savePath)
  52. {
  53. if (!File.Exists(zipPath))
  54. {
  55. throw new FileNotFoundException(zipPath);
  56. }
  57.  
  58. FileStream fs = File.OpenRead(zipPath);
  59. ZipInputStream zis = new ZipInputStream(fs);
  60. ZipEntry entry = zis.GetNextEntry();
  61. while (entry != null)
  62. {
  63. string filename = savePath + Path.DirectorySeparatorChar + entry.Name;
  64. string dir = Path.GetDirectoryName(filename);
  65. if (!Directory.Exists(dir))
  66. Directory.CreateDirectory(dir);
  67.  
  68. if (!entry.IsDirectory)
  69. WriteFile(filename, zis);
  70.  
  71. zis.CloseEntry();
  72. entry = zis.GetNextEntry();
  73. }
  74. zis.Close();
  75. }
  76.  
  77. private static void CompressFile(string filePath, string savePath)
  78. {
  79. if (!File.Exists(filePath))
  80. {
  81. throw new FileNotFoundException(filePath);
  82. }
  83.  
  84. ZipOutputStream zs = new ZipOutputStream(File.Create(savePath));
  85. ZipEntry entry = new ZipEntry(filePath);
  86. entry.DateTime = DateTime.Now;
  87. zs.PutNextEntry(entry);
  88. zs.Close();
  89. }
  90.  
  91. private static void CompressDirectory(string dir, string savePath)
  92. {
  93. if (!Directory.Exists(dir))
  94. {
  95. throw new DirectoryNotFoundException(dir);
  96. }
  97.  
  98. string parent_dir = Directory.GetParent(dir).FullName;
  99.  
  100. ZipOutputStream zs = new ZipOutputStream(File.Create(savePath));
  101. dir_list.Clear();
  102. dir_list.Add(dir);
  103. SearchDirectory(dir);
  104.  
  105. //遍历所有文件夹
  106. for (int i = 0; i < dir_list.Count; i++)
  107. {
  108. string path = dir_list[i];
  109. DirectoryInfo TheFolder = new DirectoryInfo(path);
  110. //遍历文件夹下的所有文件
  111. foreach (FileInfo NextFile in TheFolder.GetFiles())
  112. {
  113. if (NextFile.Extension.Equals(".zip"))
  114. continue;
  115. FileStream fs = null;
  116. try
  117. {
  118. fs = NextFile.Open(FileMode.Open, FileAccess.ReadWrite);
  119. }
  120. catch
  121. {
  122. continue;
  123. }
  124. //将文件分批读入缓存中
  125. byte[] data = new byte[2048];
  126. int size = 2048;
  127. ZipEntry entry = new ZipEntry(Path.GetFileName(NextFile.Name));
  128. entry.DateTime = DateTime.Now;
  129. zs.PutNextEntry(entry);
  130. while (true)
  131. {
  132. size = fs.Read(data, 0, size);
  133. if (size <= 0) break;
  134. zs.Write(data, 0, size);
  135. }
  136. fs.Close();
  137. }
  138. }
  139. zs.Finish();
  140. zs.Close();
  141. }
  142.  
  143. private static List<string> dir_list = new List<string>();
  144.  
  145. private static void SearchDirectory(string dir)
  146. {
  147. DirectoryInfo TheFolder = new DirectoryInfo(dir);
  148. foreach (DirectoryInfo NextFolder in TheFolder.GetDirectories())
  149. {
  150. dir_list.Add(NextFolder.FullName);
  151. SearchDirectory(NextFolder.FullName);
  152. }
  153. }
  154.  
  155. private static void WriteFile(string saveFile, ZipInputStream zis)
  156. {
  157. //创建目录
  158. string dir = Path.GetDirectoryName(saveFile);
  159. if (!Directory.Exists(dir))
  160. Directory.CreateDirectory(dir);
  161.  
  162. byte[] buffer = new byte[4 * 1024];
  163. FileStream fs = File.Create(saveFile);
  164. int len = 0;
  165. while ((len = zis.Read(buffer, 0, buffer.Length)) > 0)
  166. {
  167. fs.Write(buffer, 0, len);
  168. }
  169. fs.Close();
  170. }
  171. }
  172. }

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号