C#壓縮文件可以使用第三方dll庫:ICSharpCode.SharpZipLib.dll;
以下代碼能實現文件夾與多個文件的同時壓縮。(例:把三個文件夾和五個文件一起壓縮成一個zip)
直接上代碼,代碼來自:http://blog.csdn.net/jk007/article/details/8115825
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 using System.Diagnostics; 7 using ICSharpCode.SharpZipLib; 8 using ICSharpCode.SharpZipLib.Zip; 9 using ICSharpCode.SharpZipLib.Checksums; 10 using ICSharpCode.SharpZipLib.Core; 11 12 namespace TestForm 13 14 { 15 public class ZipHelper 16 { 17 /// <summary> 18 /// 壓縮文件 19 /// </summary> 20 /// <param name="sourceFilePath"></param> 21 /// <param name="destinationZipFilePath"></param> 22 public static void CreateZip(string sourceFilePath, string destinationZipFilePath) 23 { 24 if (sourceFilePath[sourceFilePath.Length - 1] != System.IO.Path.DirectorySeparatorChar) 25 sourceFilePath += System.IO.Path.DirectorySeparatorChar; 26 ZipOutputStream zipStream = new ZipOutputStream(File.Create(destinationZipFilePath)); 27 zipStream.SetLevel(6); // 壓縮級別 0-9 28 CreateZipFiles(sourceFilePath, zipStream); 29 zipStream.Finish(); 30 zipStream.Close(); 31 } 32 /// <summary> 33 /// 遞歸壓縮文件 34 /// </summary> 35 /// <param name="sourceFilePath">待壓縮的文件或文件夾路徑</param> 36 /// <param name="zipStream">打包結果的zip文件路徑(類似 D:\WorkSpace\a.zip),全路徑包括文件名和.zip擴展名</param> 37 /// <param name="staticFile"></param> 38 private static void CreateZipFiles(string sourceFilePath, ZipOutputStream zipStream) 39 { 40 Crc32 crc = new Crc32(); 41 string[] filesArray = Directory.GetFileSystemEntries(sourceFilePath); 42 foreach (string file in filesArray) 43 { 44 if (Directory.Exists(file)) //如果當前是文件夾,遞歸 45 { 46 CreateZipFiles(file, zipStream); 47 } 48 else //如果是文件,開始壓縮 49 { 50 FileStream fileStream = File.OpenRead(file); 51 byte[] buffer = new byte[fileStream.Length]; 52 fileStream.Read(buffer, 0, buffer.Length); 53 string tempFile = file.Substring(sourceFilePath.LastIndexOf("\\") + 1); 54 ZipEntry entry = new ZipEntry(tempFile); 55 entry.DateTime = DateTime.Now; 56 entry.Size = fileStream.Length; 57 fileStream.Close(); 58 crc.Reset(); 59 crc.Update(buffer); 60 entry.Crc = crc.Value; 61 zipStream.PutNextEntry(entry); 62 zipStream.Write(buffer, 0, buffer.Length); 63 } 64 } 65 } 66 } 67 }
運行時可能發生報錯,斷點不能進入該類中的函數,故障信息為不能加載該程序集。
故障分析:
1. 在下載dll文件後切不可在工程外部直接引用dll,把其放在自己工程的bin目錄下。
2. 注意該dll的版本,可能是32位的,可能是64位的,那麼在VS的生成中就要設置相應的目標平台。32位對應於X86,64位對應X64。