1. 程式人生 > >C# 文件/文件夾壓縮解壓

C# 文件/文件夾壓縮解壓

checksum dwr exist 分批 mar new files summary etime

第一次寫,還有點小激動,項目上用到的,做個記錄先,哈哈。

需要先引用ICSharpCode.SharpZipLib.dll

技術分享圖片
  1 using System;
  2 using System.Data;
  3 using System.Configuration;
  4 using System.Collections.Generic;
  5 using System.IO;
  6 using ICSharpCode.SharpZipLib.Zip;
  7 using ICSharpCode.SharpZipLib.Checksums;
  8 namespace BLL
  9
{ 10 /// <summary> 11 /// 文件(夾)壓縮、解壓縮 12 /// </summary> 13 public class FileCompression 14 { 15 #region 壓縮文件 16 /// <summary> 17 /// 壓縮文件 18 /// </summary> 19 /// <param name="fileNames">要打包的文件列表</param>
20 /// <param name="GzipFileName">目標文件名</param> 21 /// <param name="CompressionLevel">壓縮品質級別(0~9)</param> 22 /// <param name="deleteFile">是否刪除原文件</param> 23 public static void CompressFile(List<FileInfo> fileNames, string
GzipFileName, int CompressionLevel, bool deleteFile) 24 { 25 ZipOutputStream s = new ZipOutputStream(File.Create(GzipFileName)); 26 try 27 { 28 s.SetLevel(CompressionLevel); //0 - store only to 9 - means best compression 29 foreach (FileInfo file in fileNames) 30 { 31 FileStream fs = null; 32 try 33 { 34 fs = file.Open(FileMode.Open, FileAccess.ReadWrite); 35 } 36 catch 37 { continue; } 38 // 方法二,將文件分批讀入緩沖區 39 byte[] data = new byte[2048]; 40 int size = 2048; 41 ZipEntry entry = new ZipEntry(Path.GetFileName(file.Name)); 42 entry.DateTime = (file.CreationTime > file.LastWriteTime ? file.LastWriteTime : file.CreationTime); 43 s.PutNextEntry(entry); 44 while (true) 45 { 46 size = fs.Read(data, 0, size); 47 if (size <= 0) break; 48 s.Write(data, 0, size); 49 } 50 fs.Close(); 51 if (deleteFile) 52 { 53 file.Delete(); 54 } 55 } 56 } 57 finally 58 { 59 s.Finish(); 60 s.Close(); 61 } 62 } 63 /// <summary> 64 /// 壓縮文件夾 65 /// </summary> 66 /// <param name="dirPath">要打包的文件夾</param> 67 /// <param name="GzipFileName">目標文件名</param> 68 /// <param name="CompressionLevel">壓縮品質級別(0~9)</param> 69 /// <param name="deleteDir">是否刪除原文件夾</param> 70 public static void CompressDirectory(string dirPath, string GzipFileName, int CompressionLevel, bool deleteDir) 71 { 72 //壓縮文件為空時默認與壓縮文件夾同一級目錄 73 if (GzipFileName == string.Empty) 74 { 75 GzipFileName = dirPath.Substring(dirPath.LastIndexOf("//") + 1); 76 GzipFileName = dirPath.Substring(0, dirPath.LastIndexOf("//")) + "//" + GzipFileName + ".zip"; 77 } 78 //if (Path.GetExtension(GzipFileName) != ".zip") 79 //{ 80 // GzipFileName = GzipFileName + ".zip"; 81 //} 82 using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(GzipFileName))) 83 { 84 zipoutputstream.SetLevel(CompressionLevel); 85 Crc32 crc = new Crc32(); 86 Dictionary<string, DateTime> fileList = GetAllFies(dirPath); 87 foreach (KeyValuePair<string, DateTime> item in fileList) 88 { 89 FileStream fs = File.OpenRead(item.Key.ToString()); 90 byte[] buffer = new byte[fs.Length]; 91 fs.Read(buffer, 0, buffer.Length); 92 ZipEntry entry = new ZipEntry(item.Key.Substring(dirPath.Length)); 93 entry.DateTime = item.Value; 94 entry.Size = fs.Length; 95 fs.Close(); 96 crc.Reset(); 97 crc.Update(buffer); 98 entry.Crc = crc.Value; 99 zipoutputstream.PutNextEntry(entry); 100 zipoutputstream.Write(buffer, 0, buffer.Length); 101 } 102 } 103 if (deleteDir) 104 { 105 Directory.Delete(dirPath, true); 106 } 107 } 108 /// <summary> 109 /// 獲取所有文件 110 /// </summary> 111 /// <returns></returns> 112 private static Dictionary<string, DateTime> GetAllFies(string dir) 113 { 114 Dictionary<string, DateTime> FilesList = new Dictionary<string, DateTime>(); 115 DirectoryInfo fileDire = new DirectoryInfo(dir); 116 if (!fileDire.Exists) 117 { 118 throw new System.IO.FileNotFoundException("目錄:" + fileDire.FullName + "沒有找到!"); 119 } 120 GetAllDirFiles(fileDire, FilesList); 121 GetAllDirsFiles(fileDire.GetDirectories(), FilesList); 122 return FilesList; 123 } 124 /// <summary> 125 /// 獲取一個文件夾下的所有文件夾裏的文件 126 /// </summary> 127 /// <param name="dirs"></param> 128 /// <param name="filesList"></param> 129 private static void GetAllDirsFiles(DirectoryInfo[] dirs, Dictionary<string, DateTime> filesList) 130 { 131 foreach (DirectoryInfo dir in dirs) 132 { 133 foreach (FileInfo file in dir.GetFiles("*.*")) 134 { 135 filesList.Add(file.FullName, file.LastWriteTime); 136 } 137 GetAllDirsFiles(dir.GetDirectories(), filesList); 138 } 139 } 140 /// <summary> 141 /// 獲取一個文件夾下的文件 142 /// </summary> 143 /// <param name="dir">目錄名稱</param> 144 /// <param name="filesList">文件列表HastTable</param> 145 private static void GetAllDirFiles(DirectoryInfo dir, Dictionary<string, DateTime> filesList) 146 { 147 foreach (FileInfo file in dir.GetFiles("*.*")) 148 { 149 filesList.Add(file.FullName, file.LastWriteTime); 150 } 151 } 152 #endregion 153 #region 解壓縮文件 154 /// <summary> 155 /// 解壓縮文件 156 /// </summary> 157 /// <param name="GzipFile">壓縮包文件名</param> 158 /// <param name="targetPath">解壓縮目標路徑</param> 159 public static void Decompress(string GzipFile, string targetPath) 160 { 161 //string directoryName = Path.GetDirectoryName(targetPath + "//") + "//"; 162 string directoryName = targetPath; 163 if (!Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName);//生成解壓目錄 164 string CurrentDirectory = directoryName; 165 byte[] data = new byte[2048]; 166 int size = 2048; 167 ZipEntry theEntry = null; 168 using (ZipInputStream s = new ZipInputStream(File.OpenRead(GzipFile))) 169 { 170 while ((theEntry = s.GetNextEntry()) != null) 171 { 172 if (theEntry.IsDirectory) 173 {// 該結點是目錄 174 if (!Directory.Exists(CurrentDirectory + theEntry.Name)) Directory.CreateDirectory(CurrentDirectory + theEntry.Name); 175 } 176 else 177 { 178 if (theEntry.Name != String.Empty) 179 { 180 // 檢查多級目錄是否存在 181 if (theEntry.Name.Contains("//")) 182 { 183 string parentDirPath = theEntry.Name.Remove(theEntry.Name.LastIndexOf("//") + 1); 184 if (!Directory.Exists(parentDirPath)) 185 { 186 Directory.CreateDirectory(CurrentDirectory + parentDirPath); 187 } 188 } 189 190 //解壓文件到指定的目錄 191 using (FileStream streamWriter = File.Create(CurrentDirectory + theEntry.Name)) 192 { 193 while (true) 194 { 195 size = s.Read(data, 0, data.Length); 196 if (size <= 0) break; 197 streamWriter.Write(data, 0, size); 198 } 199 streamWriter.Close(); 200 } 201 } 202 } 203 } 204 s.Close(); 205 } 206 } 207 #endregion 208 } 209 }
View Code

找了好久終於知道怎麽把附件放上來了

源代碼和dll在附件裏面放著o(╥﹏╥)o:

https://files-cdn.cnblogs.com/files/DreamZhao/C%E5%8E%8B%E7%BC%A9%E6%96%87%E4%BB%B6.zip

C# 文件/文件夾壓縮解壓