本文实例讲述了asp.net C#实现解压缩文件的方法。一共给大家介绍了三段代码,一个是简单的解压缩单个zip文件,后一个可以解压批量的大量的但需要调用ICSharpCode.SharpZipLib.dll类了,最后一个比较实例可压缩也可以解压缩了分享给大家供大家参考。具体如下:
解压缩单个文件:
using System.IO; using System.IO.Compression; string sourceFile=@"D:2.zip"; string destinationFile=@"D:1.txt"; private const long BUFFER_SIZE = 20480; // make sure the source file is there if (File.Exists ( sourceFile )) { FileStream sourceStream = null; FileStream destinationStream = null; GZipStream decompressedStream = null; byte[] quartetBuffer = null; try { // Read in the compressed source stream sourceStream = new FileStream ( sourceFile, FileMode.Open ); // Create a compression stream pointing to the destiantion stream decompressedStream = new DeflateStream ( sourceStream, CompressionMode.Decompress, true ); // Read the footer to determine the length of the destiantion file quartetBuffer = new byte[4]; int position = (int)sourceStream.Length - 4; sourceStream.Position = position; sourceStream.Read ( quartetBuffer, 0, 4 ); sourceStream.Position = 0; int checkLength = BitConverter.ToInt32 ( quartetBuffer, 0 ); byte[] buffer = new byte[checkLength + 100]; int offset = 0; int total = 0; // Read the compressed data into the buffer while ( true ) { int bytesRead = decompressedStream.Read ( buffer, offset, 100 ); if ( bytesRead == 0 ) break; offset += bytesRead; total += bytesRead; } // Now write everything to the destination file destinationStream = new FileStream ( destinationFile, FileMode.Create ); destinationStream.Write ( buffer, 0, total ); // and flush everyhting to clean out the buffer destinationStream.Flush ( ); } catch ( ApplicationException ex ) { Console.WriteLine(ex.Message, "解压文件时发生错误:"); } finally { // Make sure we allways close all streams if ( sourceStream != null ) sourceStream.Close ( ); if ( decompressedStream != null ) decompressedStream.Close ( ); if ( destinationStream != null ) destinationStream.Close ( ); } }
批量解压缩(这需要调用一个解压缩类库。。 ICSharpCode.SharpZipLib.dll)
using System; using System.IO; using System.Collections.Generic; using System.Text; using ICSharpCode.SharpZipLib.Zip; namespace ZipLib { /// <summary> /// 解压缩类 /// </summary> public static class ZIP { /// <summary> /// 解压ZIP文件包 /// </summary> /// <param name="strZipFile">ZIP文件路径</param> /// <param name="strDir">解压后的文件目录路径</param> /// <returns>是否解压成功</returns> public static bool unzipFiles(string strZipFile, string strDir) { //判断ZIP文件是否存在 if (File.Exists(strZipFile)) { //判断目录是否存在 bool bUnzipDir = false; //判断是否需要创建目录 if (!Directory.Exists(strDir)) bUnzipDir = (Directory.CreateDirectory(strDir) != null); else bUnzipDir = true; //如果解压目录存在 if (bUnzipDir) { //获得ZIP数据流 ZipInputStream zipStream = new ZipInputStream(File.OpenRead(strZipFile)); if (zipStream != null) { ZipEntry zipEntry = null; while ((zipEntry = zipStream.GetNextEntry()) != null) { string strUnzipFile = strDir + "//" + zipEntry.Name; string strFileName = Path.GetFileName(strUnzipFile); string strDirName = Path.GetDirectoryName(strUnzipFile); //是否为解压目录 if (!string.IsNullOrEmpty(strDirName)) Directory.CreateDirectory(strDirName); //是否为解压文件 if (!string.IsNullOrEmpty(strFileName)) { //解压文件 FileStream unzipFileStream = new FileStream(strUnzipFile, FileMode.Create); if (unzipFileStream != null) { byte[] buf = new byte[2048]; int size = 0; while ((size = zipStream.Read(buf, 0, 2048)) > 0) unzipFileStream.Write(buf, 0, size); //关闭Stream unzipFileStream.Flush(); unzipFileStream.Close(); } } } //关闭ZIP流 zipStream.Close(); //返回值 return true; } } } return false; } } }
下载SharpZipLib.dll,在http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx中有最新免费版本,“Assemblies for .NET 1.1, .NET 2.0, .NET CF 1.0, .NET CF 2.0: Download [297 KB] ”点击Download可以下载,解压后里边有好多文件夹,因为不同的版本,我用的FW2.0。
或者点击此处本站下载。
引用SharpZipLib.dll,在项目中点击项目右键-->添加引用-->浏览,找到要添加的DLL-->确认
改写了文件压缩和解压缩的两个类,新建两个类名字为ZipFloClass.cs,UnZipFloClass.cs
源码如下
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.IO; using ICSharpCode.SharpZipLib.Checksums; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.GZip; /// <summary> /// ZipFloClass 的摘要说明 /// </summary> public class ZipFloClass { public void ZipFile(string strFile, string strZip) { if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) strFile += Path.DirectorySeparatorChar; ZipOutputStream s = new ZipOutputStream(File.Create(strZip)); s.SetLevel(6); // 0 - store only to 9 - means best compression zip(strFile, s, strFile); s.Finish(); s.Close(); }private void zip(string strFile, ZipOutputStream s, string staticFile) { if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) strFile += Path.DirectorySeparatorChar; Crc32 crc = new Crc32(); string[] filenames = Directory.GetFileSystemEntries(strFile); foreach (string file in filenames) { if (Directory.Exists(file)) { zip(file, s, staticFile); } else // 否则直接压缩文件 { //打开压缩文件 FileStream fs = File.OpenRead(file); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); string tempfile = file.Substring(staticFile.LastIndexOf("\") + 1); ZipEntry entry = new ZipEntry(tempfile); entry.DateTime = DateTime.Now; entry.Size = fs.Length; fs.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; s.PutNextEntry(entry); s.Write(buffer, 0, buffer.Length); } } } }
using System; using System.Data; using System.Web; using System.Text; using System.Collections; using System.IO; using System.Diagnostics; using System.Runtime.Serialization.Formatters.Binary; using ICSharpCode.SharpZipLib.BZip2; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Zip.Compression; using ICSharpCode.SharpZipLib.Zip.Compression.Streams; using ICSharpCode.SharpZipLib.GZip; using ICSharpCode.SharpZipLib.Checksums;/// <summary> /// UnZipFloClass 的摘要说明 /// </summary> public class UnZipFloClass { public string unZipFile(string TargetFile, string fileDir) { string rootFile = " "; try { //读取压缩文件(zip文件),准备解压缩 ZipInputStream s = new ZipInputStream(File.OpenRead(TargetFile.Trim())); ZipEntry theEntry; string path = fileDir; //解压出来的文件保存的路径 string rootDir = " "; //根目录下的第一个子文件夹的名称 while ((theEntry = s.GetNextEntry()) != null) { rootDir = Path.GetDirectoryName(theEntry.Name); //得到根目录下的第一级子文件夹的名称 if (rootDir.IndexOf("\") >= 0) { rootDir = rootDir.Substring(0, rootDir.IndexOf("\") + 1); } string dir = Path.GetDirectoryName(theEntry.Name); //根目录下的第一级子文件夹的下的文件夹的名称 string fileName = Path.GetFileName(theEntry.Name); //根目录下的文件名称 if (dir != " " ) //创建根目录下的子文件夹,不限制级别 { if (!Directory.Exists(fileDir + "\" + dir)) { path = fileDir + "\" + dir; //在指定的路径创建文件夹 Directory.CreateDirectory(path); } } else if (dir == " " && fileName != "") //根目录下的文件 { path = fileDir; rootFile = fileName; } else if (dir != " " && fileName != "") //根目录下的第一级子文件夹下的文件 { if (dir.IndexOf("\") > 0) //指定文件保存的路径 { path = fileDir + "\" + dir; } } if (dir == rootDir) //判断是不是需要保存在根目录下的文件 { path = fileDir + "\" + rootDir; } //以下为解压缩zip文件的基本步骤 //基本思路就是遍历压缩文件里的所有文件,创建一个相同的文件。 if (fileName != String.Empty) { FileStream streamWriter = File.Create(path + "\" + fileName); int size = 2048; byte[] data = new byte[2048]; while (true) { size = s.Read(data, 0, data.Length); if (size > 0) { streamWriter.Write(data, 0, size); } else { break; } } streamWriter.Close(); } } s.Close(); return rootFile; } catch (Exception ex) { return "1; " + ex.Message; } } }
protected void Button1_Click(object sender, EventArgs e) { string[] FileProperties = new string[2]; FileProperties[0] = "D:\unzipped\";//待压缩文件目录 FileProperties[1] = "D:\zip\a.zip"; //压缩后的目标文件 ZipFloClass Zc = new ZipFloClass(); Zc.ZipFile(FileProperties[0], FileProperties[1]); } protected void Button2_Click(object sender, EventArgs e) { string[] FileProperties = new string[2]; FileProperties[0] = "D:\zip\b.zip";//待解压的文件 FileProperties[1] = "D:\unzipped\";//解压后放置的目标目录 UnZipFloClass UnZc = new UnZipFloClass(); UnZc.unZipFile(FileProperties[0], FileProperties[1]); }
希望本文所述对大家的asp.net程序设计有所帮助。
本文向大家介绍PHP 实现文件压缩解压操作的方法,包括了PHP 实现文件压缩解压操作的方法的使用技巧和注意事项,需要的朋友参考一下 在php中,有时我们需要使用到压缩文件操作,压缩文件可以节省磁盘空间;且压缩文件更小,便于网络传输,效率高,下面我们就来了解php的压缩解压相关操作 在PHP中有一个ZipArchive类,专门用于文件的压缩解压相关操作 在ZipArchive类中主要使用到了如下方法
本文向大家介绍C#实现的文件压缩和解压缩类,包括了C#实现的文件压缩和解压缩类的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现的文件压缩和解压缩类。分享给大家供大家参考。具体分析如下: 这个C#代码包含了几个类,封装了文件压缩和解压缩常用的方法,包括直接通过代码进行压缩,也有调用winrar对文件进行压缩的 希望本文所述对大家的C#程序设计有所帮助。
本文向大家介绍Android如何实现压缩和解压缩文件,包括了Android如何实现压缩和解压缩文件的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴java代码了,具体代码如下所示: Java代码 代码到此结束,关于Android实现压缩和解压缩文件的全内容就给大家介绍这么多,希望能够帮助到大家!
本文向大家介绍java实现文件夹解压和压缩,包括了java实现文件夹解压和压缩的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java实现文件夹解压和压缩的具体代码,供大家参考,具体内容如下 效果 实现多个文件以及文件夹的压缩和解压 代码分析 小结 压缩 ZipOutputStream可以把多份数据写入zip包; 解压 ZipInputStream可以读取zip格式的流; 以上就是本
我正在使用Julia的ZipFile包来提取和处理csv文件。没问题,但是当我遇到zip文件中的zip文件时,我也想处理它,但是遇到了一个错误。 Julia ZipFile文档如下:https://zipfilejl.readthedocs.io/en/latest/ 对如何做到这一点有什么想法吗?
本文向大家介绍基于Node.js实现压缩和解压缩的方法,包括了基于Node.js实现压缩和解压缩的方法的使用技巧和注意事项,需要的朋友参考一下 压缩格式 zip 和 gzip 是两种我们最常见到的压缩格式,当然,gzip 在 Windows 下很少有人接触。 tar 是一种归档格式,它默认不会压缩,需要结合 gzip 来将最终的 tar 文件以 gzip 格式压缩成为一个 tar.gz 文件,通常