文件的压缩与解压
#region[解压文件] /// <summary> /// 解压文件 /// </summary> /// <param name="zipFileName">zip文件路径+zip文件名称</param> /// <param name="targetDirectory">解压后文件保存路径</param> /// <param name="fileFilter">解压zip文件中指定文件,若为null,则对解压后的文件不做筛选</param> /// <returns></returns> public static Boolean ExtractZip(string zipFileName, string targetDirectory, string fileFilter) { try { //FastZip 添加引用 ICSharpCode.SharpZipLib.Zip; FastZip fastZip = new FastZip(); fastZip.ExtractZip(zipFileName, targetDirectory, fileFilter); return true; } catch { return false; } } //解压zip文件中某个指定文件 public void DeCompressOne() { string zipFileName = @"E:\20190903\测试文件\测试.zip";//zip文件路径+zip文件名 string subPath = @"E:\20190903\非zip文件\" + DateTime.Now.ToString("yyyyMMddhhmmss"); string fileFilter = "测试.txt"; System.IO.Directory.CreateDirectory(subPath);//创建文件夹,保存解压后的文件 string targetDirectory = subPath;//解压后文件保存路径 Boolean bl = ExtractZip(zipFileName, targetDirectory, fileFilter); } // 解压zip文件 protected void DeCompress() { string zipFileName = @"E:\20190903\测试文件\测试.zip";//zip文件路径+zip文件名 string subPath = @"E:\20190903\非zip文件\" + DateTime.Now.ToString("yyyyMMddhhmmss"); System.IO.Directory.CreateDirectory(subPath);//创建文件夹,保存解压后的文件 string targetDirectory = subPath;//解压后文件保存路径 Boolean bl = ExtractZip(zipFileName, targetDirectory, null); } #endregion #region[压缩文件] /// <summary> /// 压缩文件 /// </summary> /// <param name="zipFileName">zip文件保存路径+zip文件名称</param> /// <param name="sourceDirectory">压缩来源文件路径</param> /// <param name="recurse"></param> /// <param name="fileFilter">压缩文件夹中指定文件,若为null,则压缩文件夹中所有的文件</param> /// <returns></returns> public static Boolean CreateZip(string zipFileName, string sourceDirectory, bool recurse, string fileFilter) { try { //FastZip 添加引用 ICSharpCode.SharpZipLib.Zip; FastZip fastZip = new FastZip(); fastZip.CreateZip(zipFileName, sourceDirectory, recurse, fileFilter); return true; } catch { return false; } } //压缩一个文件 protected void CompressOne() { string subPath = @"E:\20190903\zip文件\" + DateTime.Now.ToString("yyyyMMddhhmmss"); System.IO.Directory.CreateDirectory(subPath);//创建文件夹,保存压缩后的文件 string zipFileName = subPath + @"\测试.zip";//压缩文件路径+压缩文件名(压缩文件名可以自定义) string sourceDirectory = @"E:\20190903\测试文件\"; string fileFilter = @"测试.txt"; Boolean bl = CreateZip(zipFileName, sourceDirectory, false, fileFilter); } // 压缩一个文件夹 protected void Compress() { string subPath = @"E:\20190903\zip文件\" + DateTime.Now.ToString("yyyyMMddhhmmss"); System.IO.Directory.CreateDirectory(subPath);//创建文件夹,保存压缩后的文件 string zipFileName = subPath + @"\测试.zip";//压缩文件路径+压缩文件名(压缩文件名可以自定义) string sourceDirectory = @"E:\20190903\测试文件\"; Boolean bl = CreateZip(zipFileName, sourceDirectory, true, null); } #endregion #region[文件流的解压与压缩] #region[Way1] public static void Way1() { //压缩文件流 string str = "文件流的压缩与解压相关代码"; //使用FileStream 要添加引用 System.IO; FileStream fs = File.OpenWrite(@"E:\20190903\测试文件\内存流处理.txt");// 打开一个现有文件或创建一个新文件以进行写入。(用于保存压缩的byte数组) //使用GZipStream 要添加引用 System.IO.Compression; (GZipStream 提供用于压缩和解压缩流的方法和属性。提供用于压缩和解压缩流的方法和属性。) GZipStream zipStream = new GZipStream(fs, CompressionMode.Compress);//CompressionMode.Compress:将压缩的基础流。 //使用Encoding 要添加引用:System.Text byte[] bytes = Encoding.UTF8.GetBytes(str); zipStream.Write(bytes, 0, bytes.Length);//从指定的字节数组中将压缩的字节写入基础流。 zipStream.Close(); fs.Close(); //解压文件流 FileStream fs2 = File.OpenRead(@"E:\20190903\测试文件\内存流处理.txt");//打开现有文件以进行读取。(txt文件保存的是byte数组) GZipStream zipStream2 = new GZipStream(fs2, CompressionMode.Decompress);//CompressionMode.Decompress:解压缩基础流。 FileStream fs3 = File.OpenWrite(@"E:\20190903\测试文件\内存流处理2.txt");// 打开一个现有文件或创建一个新文件以进行写入。(用于保存压缩的byte数组) int bytesRead; while ((bytesRead = zipStream2.Read(bytes, 0, bytes.Length)) > 0) //将若干解压缩的字节读入指定的字节数组。 { fs3.Write(bytes, 0, bytesRead); } fs3.Close(); zipStream2.Close(); fs2.Close(); } #endregion #region[Way2] public static void Way2() { //压缩文件流(使用using(){} 关闭和释放不需要手动操作) string str = "文件流的压缩与解压相关代码2"; using (FileStream fs = File.OpenWrite(@"E:\20190903\测试文件\内存流处理.txt")) { using (GZipStream zipStream = new GZipStream(fs, CompressionMode.Compress)) { byte[] bytes = Encoding.UTF8.GetBytes(str); zipStream.Write(bytes, 0, bytes.Length); } } //解压文件流(使用using(){} 关闭和释放不需要手动操作) using (FileStream fs = File.OpenRead(@"E:\20190903\测试文件\内存流处理.txt")) { using (GZipStream zipStream = new GZipStream(fs, CompressionMode.Decompress)) { using (FileStream fs1 = File.OpenWrite(@"E:\20190903\测试文件\内存流处理2.txt")) { int bytesRead; byte[] bytes = new byte[1024]; while ((bytesRead = zipStream.Read(bytes, 0, bytes.Length)) > 0) { fs1.Write(bytes, 0, bytesRead); } } } } } #endregion #region[Way3] public static void Way3() { string testdata = "GZip压缩和解压"; //压缩 byte[] gzipdata = CompressGZip(Encoding.UTF8.GetBytes(testdata)); //解压 byte[] undata = UnGZip(gzipdata); var pp = Encoding.UTF8.GetString(undata); } //压缩文件 public static byte[] CompressGZip(byte[] rawData) { //MemoryStream需要添加引用 System.IO; MemoryStream ms = new MemoryStream(); //GZipOutputStream要添加引用 ICSharpCode.SharpZipLib.GZip GZipOutputStream compressedzipStream = new GZipOutputStream(ms); compressedzipStream.Write(rawData, 0, rawData.Length); compressedzipStream.Close(); return ms.ToArray(); } //解压文件 public static byte[] UnGZip(byte[] byteArray) { //MemoryStream需要添加引用 System.IO; MemoryStream re = new MemoryStream(); //GZipOutputStream要添加引用 ICSharpCode.SharpZipLib.GZip GZipInputStream gzi = new GZipInputStream(new MemoryStream(byteArray)); int count; byte[] data = new byte[1024]; while ((count = gzi.Read(data, 0, data.Length)) != 0) { re.Write(data, 0, count); } byte[] overarr = re.ToArray(); return overarr; } #endregion #endregion
凡事预则立,不预则废。