ZipHelper

本文只列举一个压缩帮助类,使用的是有要添加一个dll引用ICSharpCode.SharpZipLib.dll。另外说明一下的是,这个类压缩格式是ZIP的,所以文件的后缀写成 .zip

还有,如果用这个类来解压rar格式的压缩文件时会报错,就网上说的那个"Wrong Local header signature: 0x21726152"异常。只要解压ZIP压缩格式的压缩文件就不会报错了。 下面就是Helper类的代码

  1 using System;

  2 using System.Collections.Generic;

  3 using System.Linq;

  4 using System.Text;

  5 using System.IO;

  6 using ICSharpCode.SharpZipLib;

  7 using ICSharpCode.SharpZipLib.Zip;

  8 using ICSharpCode.SharpZipLib.Checksums;

  9 

 10 namespace MyHelpers.Helpers

 11 {

 12     /// <summary>

 13     /// 适用与ZIP压缩

 14     /// </summary>

 15     public class ZipHelper

 16     {

 17         #region 压缩

 18 

 19         /// <summary>

 20         /// 递归压缩文件夹的内部方法

 21         /// </summary>

 22         /// <param name="folderToZip">要压缩的文件夹路径</param>

 23         /// <param name="zipStream">压缩输出流</param>

 24         /// <param name="parentFolderName">此文件夹的上级文件夹</param>

 25         /// <returns></returns>

 26         private static bool ZipDirectory(string folderToZip, ZipOutputStream zipStream, string parentFolderName)

 27         {

 28             bool result = true;

 29             string [] folders, files;

 30             ZipEntry ent = null;

 31             FileStream fs = null;

 32             Crc32 crc = new Crc32();

 33 

 34             try

 35             {

 36                 ent = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/"));

 37                 zipStream.PutNextEntry(ent);

 38                 zipStream.Flush();

 39 

 40                 files = Directory.GetFiles(folderToZip);

 41                 foreach (string file in files)

 42                 {

 43                     fs = File.OpenRead(file);

 44 

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

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

 47                     ent = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/" + Path.GetFileName(file)));

 48                     ent.DateTime = DateTime.Now;

 49                     ent.Size = fs.Length;

 50 

 51                     fs.Close();

 52 

 53                     crc.Reset();

 54                     crc.Update(buffer);

 55 

 56                     ent.Crc = crc.Value;

 57                     zipStream.PutNextEntry(ent);

 58                     zipStream.Write(buffer, 0, buffer.Length);

 59                 }

 60 

 61             }

 62             catch

 63             {

 64                 result = false;

 65             }

 66             finally

 67             {

 68                 if (fs != null)

 69                 {

 70                     fs.Close();

 71                     fs.Dispose();

 72                 }

 73                 if (ent != null)

 74                 {

 75                     ent = null;

 76                 }

 77                 GC.Collect();

 78                 GC.Collect(1);

 79             }

 80 

 81             folders = Directory.GetDirectories(folderToZip);

 82             foreach (string folder in folders)

 83                 if (!ZipDirectory(folder, zipStream, folderToZip))

 84                     return false;

 85 

 86             return result;

 87         }

 88 

 89         /// <summary>

 90         /// 压缩文件夹 

 91         /// </summary>

 92         /// <param name="folderToZip">要压缩的文件夹路径</param>

 93         /// <param name="zipedFile">压缩文件完整路径</param>

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

 95         /// <returns>是否压缩成功</returns>

 96         public static bool ZipDirectory(string folderToZip, string zipedFile, string password)

 97         {

 98             bool result = false;

 99             if (!Directory.Exists(folderToZip))

100                 return result;

101 

102             ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFile));

103             zipStream.SetLevel(6);

104             if (!string.IsNullOrEmpty(password)) zipStream.Password = password;

105 

106             result = ZipDirectory(folderToZip, zipStream, "");

107 

108             zipStream.Finish();

109             zipStream.Close();

110 

111             return result;

112         }

113 

114         /// <summary>

115         /// 压缩文件夹

116         /// </summary>

117         /// <param name="folderToZip">要压缩的文件夹路径</param>

118         /// <param name="zipedFile">压缩文件完整路径</param>

119         /// <returns>是否压缩成功</returns>

120         public static bool ZipDirectory(string folderToZip, string zipedFile)

121         {

122             bool result = ZipDirectory(folderToZip, zipedFile, null);

123             return result;

124         }

125 

126         /// <summary>

127         /// 压缩文件

128         /// </summary>

129         /// <param name="fileToZip">要压缩的文件全名</param>

130         /// <param name="zipedFile">压缩后的文件名</param>

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

132         /// <returns>压缩结果</returns>

133         public static bool ZipFile(string fileToZip, string zipedFile, string password)

134         {

135             bool result = true;

136             ZipOutputStream zipStream=null;

137             FileStream fs = null;

138             ZipEntry ent = null;

139 

140             if (!File.Exists(fileToZip))

141                 return false;

142 

143             try

144             {

145                 fs = File.OpenRead(fileToZip);

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

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

148                 fs.Close();

149 

150                 fs = File.Create(zipedFile);

151                 zipStream = new ZipOutputStream(fs);

152                 if (!string.IsNullOrEmpty(password)) zipStream.Password = password;

153                 ent = new ZipEntry(Path.GetFileName(fileToZip));

154                 zipStream.PutNextEntry(ent);

155                 zipStream.SetLevel(6);

156 

157                 zipStream.Write(buffer, 0, buffer.Length);

158 

159             }

160             catch

161             {

162                 result = false;

163             }

164             finally

165             {

166                 if (zipStream != null)

167                 {

168                     zipStream.Finish();

169                     zipStream.Close();

170                 }

171                 if (ent != null)

172                 {

173                     ent = null;

174                 }

175                 if (fs != null)

176                 {

177                     fs.Close();

178                     fs.Dispose();

179                 }

180             }

181             GC.Collect();

182             GC.Collect(1);

183 

184             return result;

185         }

186 

187         /// <summary>

188         /// 压缩文件

189         /// </summary>

190         /// <param name="fileToZip">要压缩的文件全名</param>

191         /// <param name="zipedFile">压缩后的文件名</param>

192         /// <returns>压缩结果</returns>

193         public static bool ZipFile(string fileToZip, string zipedFile)

194         {

195             bool result = ZipFile(fileToZip, zipedFile,null);

196             return result;

197         }

198 

199         /// <summary>

200         /// 压缩文件或文件夹

201         /// </summary>

202         /// <param name="fileToZip">要压缩的路径</param>

203         /// <param name="zipedFile">压缩后的文件名</param>

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

205         /// <returns>压缩结果</returns>

206         public static bool Zip(string fileToZip, string zipedFile, string password)

207         {

208             bool result = false;

209             if (Directory.Exists(fileToZip))

210                 result = ZipDirectory(fileToZip, zipedFile, password);

211             else if (File.Exists(fileToZip))

212                 result = ZipFile(fileToZip, zipedFile,password);

213 

214             return result;

215         }

216 

217         /// <summary>

218         /// 压缩文件或文件夹

219         /// </summary>

220         /// <param name="fileToZip">要压缩的路径</param>

221         /// <param name="zipedFile">压缩后的文件名</param>

222         /// <returns>压缩结果</returns>

223         public static bool Zip(string fileToZip, string zipedFile)

224         {

225             bool result = Zip(fileToZip, zipedFile,null);

226             return result;

227 

228         }

229 

230         #endregion

231 

232         #region 解压

233 

234         /// <summary>

235         /// 解压功能(解压压缩文件到指定目录)

236         /// </summary>

237         /// <param name="fileToUnZip">待解压的文件</param>

238         /// <param name="zipedFolder">指定解压目标目录</param>

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

240         /// <returns>解压结果</returns>

241         public static bool UnZip(string fileToUnZip, string zipedFolder, string password)

242         {

243             bool result = true;

244             FileStream fs = null;

245             ZipInputStream zipStream = null;

246             ZipEntry ent = null;

247             string fileName;

248 

249             if (!File.Exists(fileToUnZip))

250                 return false;

251 

252             if (!Directory.Exists(zipedFolder))

253                 Directory.CreateDirectory(zipedFolder);

254 

255             try

256             {

257                 zipStream=new ZipInputStream(File.OpenRead(fileToUnZip));

258                 if(!string.IsNullOrEmpty(password))zipStream.Password=password;

259                 while ((ent=zipStream.GetNextEntry())!=null)

260                 {

261                     if (!string.IsNullOrEmpty(ent.Name))

262                     {

263                         fileName = Path.Combine(zipedFolder, ent.Name);

264                         fileName = fileName.Replace('/', '\\');//change by Mr.HopeGi

265 

266                         if (fileName.EndsWith("\\"))

267                         {

268                             Directory.CreateDirectory(fileName);

269                             continue;

270                         }

271 

272                         fs = File.Create(fileName);

273                         int size = 2048;

274                         byte[] data = new byte[size];

275                         while (true)

276                         {

277                             size = fs.Read(data, 0, data.Length);

278                             if (size > 0)

279                                 fs.Write(data, 0, data.Length);

280                             else

281                                 break;

282                         }

283                     }

284                 }

285             }

286             catch

287             {

288                 result = false;

289             }

290             finally

291             {

292                 if (fs != null)

293                 {

294                     fs.Close();

295                     fs.Dispose();

296                 }

297                 if (zipStream != null)

298                 {

299                     zipStream.Close();

300                     zipStream.Dispose();

301                 }

302                 if(ent!=null)

303                 {

304                     ent = null;

305                 }

306                 GC.Collect();

307                 GC.Collect(1);

308             }

309             return result;

310         }

311 

312         /// <summary>

313         /// 解压功能(解压压缩文件到指定目录)

314         /// </summary>

315         /// <param name="fileToUnZip">待解压的文件</param>

316         /// <param name="zipedFolder">指定解压目标目录</param>

317         /// <returns>解压结果</returns>

318         public static bool UnZip(string fileToUnZip, string zipedFolder)

319         {

320             bool result = UnZip(fileToUnZip, zipedFolder,null);

321             return result;

322         }

323 

324         #endregion

325     }

326 }

 

 

你可能感兴趣的:(help)