- 浏览: 31822 次
- 性别:
- 来自: 惠州
最新评论
最近做一个项目需要压缩,解压文件夹及文件夹里面的子文件夹、文件,在网上找了许多资料,有两种实例:
实例一:
实例二:
这里有个问题,实例二中的解压文件的时候,如果解压到的路径中存在解压文件中的文件,解压的时候不会覆盖,这点值得注意。
另外压缩解压文件要用到ICSharpCode.SharpZipLib.dll这个dll,网上可以搜到下载地址。
实例一:
#region 压缩文件 /// 递归压缩文件夹方法 private bool ZipFileDictory(string FolderToZip, ZipOutputStream s, string ParentFolderName) { bool res = true; string[] folders, filenames; ZipEntry entry = null; FileStream fs = null; Crc32 crc = new Crc32(); try { //创建当前文件夹 entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/")); //加上 “/” 才会当成是文件夹创建 s.PutNextEntry(entry); s.Flush(); //先压缩文件,再递归压缩文件夹 filenames = Directory.GetFiles(FolderToZip); foreach (string file in filenames) { //打开压缩文件 fs = File.OpenRead(file); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/" + Path.GetFileName(file))); 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); } } catch { res = false; } finally { if (fs != null) { fs.Close(); fs = null; } if (entry != null) { entry = null; } GC.Collect(); GC.Collect(1); } folders = Directory.GetDirectories(FolderToZip); foreach (string folder in folders) { if (!ZipFileDictory(folder, s, Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip)))) { return false; } } return res; } /// <summary> /// 压缩目录 /// </summary> /// <param name="FolderToZip">待压缩的文件夹,全路径格式</param> /// <param name="ZipedFile">压缩后的文件名,全路径格式</param> /// <param name="Password"></param> /// <returns></returns> private bool ZipFileDictory(string FolderToZip, string ZipedFile, String Password) { bool res; if (!Directory.Exists(FolderToZip)) { return false; } ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFile)); s.SetLevel(6); s.Password = Password; res = ZipFileDictory(FolderToZip, s, ""); s.Finish(); s.Close(); return res; } /// <summary> /// 压缩文件 /// </summary> /// <param name="FileToZip">要进行压缩的文件名</param> /// <param name="ZipedFile">压缩后生成的压缩文件名</param> /// <param name="Password"></param> /// <returns></returns> private bool ZipFile(string FileToZip, string ZipedFile, String Password) { //如果文件没有找到,则报错 if (!File.Exists(FileToZip)) { throw new System.IO.FileNotFoundException("指定要压缩的文件: " + FileToZip + " 不存在!"); } //FileStream fs = null; FileStream ZipFile = null; ZipOutputStream ZipStream = null; ZipEntry ZipEntry = null; bool res = true; try { ZipFile = File.OpenRead(FileToZip); byte[] buffer = new byte[ZipFile.Length]; ZipFile.Read(buffer, 0, buffer.Length); ZipFile.Close(); ZipFile = File.Create(ZipedFile); ZipStream = new ZipOutputStream(ZipFile); ZipStream.Password = Password; ZipEntry = new ZipEntry(Path.GetFileName(FileToZip)); ZipStream.PutNextEntry(ZipEntry); ZipStream.SetLevel(6); ZipStream.Write(buffer, 0, buffer.Length); } catch { res = false; } finally { if (ZipEntry != null) { ZipEntry = null; } if (ZipStream != null) { ZipStream.Finish(); ZipStream.Close(); } if (ZipFile != null) { ZipFile.Close(); ZipFile = null; } GC.Collect(); GC.Collect(1); } return res; } /// <summary> /// 压缩文件 和 文件夹 /// </summary> /// <param name="FileToZip">待压缩的文件或文件夹,全路径格式</param> /// <param name="ZipedFile">压缩后生成的压缩文件名,全路径格式</param> /// <param name="Password"></param> /// <returns></returns> private bool Zip(String FileToZip, String ZipedFile, String Password) { if (Directory.Exists(FileToZip)) { return ZipFileDictory(FileToZip, ZipedFile, Password); } else if (File.Exists(FileToZip)) { return ZipFile(FileToZip, ZipedFile, Password); } else { return false; } } #endregion #region 解压文件 /// <summary> /// 解压功能(解压压缩文件到指定目录) /// </summary> /// <param name="FileToUpZip">待解压的文件</param> /// <param name="ZipedFolder">指定解压目标目录</param> /// <param name="Password"></param> private void UnZip(string FileToUpZip, string ZipedFolder, string Password) { if (!File.Exists(FileToUpZip)) { return; } if (!Directory.Exists(ZipedFolder)) { Directory.CreateDirectory(ZipedFolder); } ZipInputStream s = null; ZipEntry theEntry = null; string fileName; FileStream streamWriter = null; try { s = new ZipInputStream(File.OpenRead(FileToUpZip)); s.Password = Password; while ((theEntry = s.GetNextEntry()) != null) { if (theEntry.Name != String.Empty) { fileName = Path.Combine(ZipedFolder, theEntry.Name); /**/ ///判断文件路径是否是文件夹 if (fileName.EndsWith("/") || fileName.EndsWith("\\")) { Directory.CreateDirectory(fileName); continue; } streamWriter = File.Create(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; } } } } } finally { if (streamWriter != null) { streamWriter.Close(); streamWriter = null; } if (theEntry != null) { theEntry = null; } if (s != null) { s.Close(); s = null; } GC.Collect(); GC.Collect(1); } } #endregion
实例二:
#region 压缩文件方法二 public void ZipFilenew(string strFileFolder, string strZip) { if (strFileFolder[strFileFolder.Length - 1] != Path.DirectorySeparatorChar) strFileFolder += Path.DirectorySeparatorChar; ZipOutputStream s = new ZipOutputStream(File.Create(strZip)); s.SetLevel(6); // 0 - store only to 9 - means best compression zip(strFileFolder, strZip, s); s.Finish(); s.Close(); } private void zip(string strFile, string StoreFile, ZipOutputStream s) { 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, StoreFile, s); } else { //打开压缩文件,开始压缩 FileStream fs = File.OpenRead(file); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); string tempfile = file.Substring(StoreFile.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); } } } #endregion #region 解压文件方法二 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; } } #endregion
这里有个问题,实例二中的解压文件的时候,如果解压到的路径中存在解压文件中的文件,解压的时候不会覆盖,这点值得注意。
另外压缩解压文件要用到ICSharpCode.SharpZipLib.dll这个dll,网上可以搜到下载地址。
发表评论
-
C#.Net序列化,反序列化
2011-11-15 10:14 1420C#.Net序列化,反序列化 二进制序列化,反序列化方法: ... -
C#/.NET数据存储到XML
2011-09-04 13:31 2779有时候,在存储数据的时候要求存储成XML格式,我们用代 ... -
C#如何禁用datagridview控件中的button控件
2011-09-03 13:29 6234DataGridView 控件包括 DataGridViewB ... -
C#复制文件夹,删除文件夹的方法
2011-09-03 13:17 4513C#复制文件的时候只提供了复制文件的类,没有复制文件夹。 删除 ... -
SQL分页、查找行记录兼C#ASP.NET分页方法
2011-08-03 21:23 2564SQL语句: select * from (select R ... -
(转)网上找的一个使用aspnetpager控件的使用方法
2010-10-04 20:44 1581前台页面代码:Page.aspx <%@ Page L ... -
ASP.NET的一些常用的方法
2010-10-04 20:39 851观牛腩博客(http://niunan.iteye.com/) ... -
aspnetpager与datalist一起使用,dt作为数据源
2010-10-04 20:29 1300前台页面部分代码: <%@ Page Language= ... -
数据库访问助手类(SQLHelper)
2010-07-03 13:02 845说明:对数据库的操作无非就是增删改查,SQLHelper类能提 ...
相关推荐
总的来说,使用C#和WinForm创建文件夹的压缩解压工具,虽然涉及到的技术并不深奥,但实现一个完整且用户体验良好的应用仍然需要考虑很多细节,包括错误处理、用户交互以及性能优化。通过不断地实践和学习,你可以...
在.NET框架中,C#语言提供了丰富的库和API来实现文件的压缩和解压缩功能。本文将深入探讨如何使用C#进行文件的压缩与解压缩操作,主要关注使用System.IO.Compression命名空间中的ZipArchive类。 首先,让我们了解...
在.NET开发中,压缩和解压文件或文件夹是一项常见的任务。本文将深入探讨如何使用C#实现这一功能,特别是如何使用带密码保护的压缩。我们将会关注两个库:DotNetZip和SharpCompress。 首先,DotNetZip是一个强大的...
解压缩文件夹则相对简单,主要涉及读取ZIP文件内容并将其解压到目标文件夹: 1. 创建ZipFile或FileStream对象,打开ZIP文件。 2. 遍历ZipFile的Entries,获取每个压缩条目。 3. 对于每个条目,检查是否为文件或目录...
网上很少有用VB写的压缩文件的代码,但是,在网络...另外加上了多层文件夹压缩解压。但是,因为时间有限,只是将文件全部读取到缓存处理,所以,针对大文件没有做特别的处理。例子里面有提示,根据需要自己改动一下吧。
总之,C#提供了一套强大的工具来处理文件和文件夹的压缩解压,开发人员可以根据需求选择适合的API和算法。对于更复杂的需求,如加密、分块压缩或自定义压缩算法,可能需要深入研究更高级的库或实现自定义解决方案。...
在C#编程中,压缩和解压文件夹是常见的任务,尤其在数据传输、存储优化或者备份场景下。本文将详细讲解如何使用C#来实现这个功能,主要关注ZIP格式的压缩与解压缩。 首先,我们需要引入.NET Framework或.NET Core中...
总结来说,C#的ZipArchive类提供了强大的文件和文件夹压缩解压功能,使得开发者能够方便地集成这些功能到自己的应用程序中。无论是简单的文件备份,还是复杂的文件传输,都可以借助这个类来实现。通过深入理解和熟练...
要压缩一个文件夹,首先获取该文件夹的所有文件和子文件夹,然后对每个文件创建`ZipArchiveEntry`,设置其名称(相对于压缩文件的路径),并用文件内容填充。代码示例如下: ```csharp using System.IO; using ...
在C#编程中,处理文件和文件夹的压缩与解压缩是常见的任务,尤其是在软件开发、数据备份或者文件传输场景中。本篇文章将详细介绍如何在C#中实现这个功能,并且重点讲解如何设置压缩文件的密码。 首先,我们需要引入...
首先,创建一个`DirectoryInfo`对象代表要压缩的根目录,然后遍历其`GetFiles()`和`GetDirectories()`方法,对每个子文件和子文件夹调用上述的压缩文件方法。 五、解压缩文件 解压缩文件的过程与压缩相反,需要创建...
.NET框架提供了一种方便的方式来处理压缩和解压缩文件,但默认情况下并不包含全面的压缩库。在这种情况下,开发者经常依赖第三方组件,如"7-Zip",它是一个强大的开源压缩工具,提供了API供编程人员使用。本文将详细...
在C#编程中,处理文件和文件夹的压缩与解压是常见的任务,尤其是在数据传输、备份或存储优化中。本篇文章将详细讲解如何使用C#实现对文件和文件夹的压缩以及对`.zip`和`.rar`格式的解压。 首先,C#中的文件和文件夹...
在.NET框架4.5及以上版本中,C#提供了一个强大的工具来处理压缩和解压缩ZIP文件,这得益于引入了`System.IO.Compression.FileSystem`程序集。这个程序集为开发人员提供了一种简单、直观的方式来执行这些操作,无需...
在ASP.NET平台中,使用C#进行文件压缩和下载是一项常见的任务,特别是在处理大量数据或者提供批量下载服务时。这个实例主要关注如何将多个文件压缩为一个文件,并提供下载功能。接下来,我们将深入探讨实现这一功能...
本压缩包中的"C#通用文件及文件夹压缩类文件"可能包含了一个自定义的C#类库,用于简化和扩展这些功能。 首先,让我们了解一下.NET Framework自带的ZipArchive类。ZipArchive提供了一组方法和属性,允许我们创建一个...
在SQL Server 2005中,通过集成Common Language Runtime (CLR)功能,可以利用.NET Framework的类库来实现数据库内的文件压缩和解压缩操作。本文将深入探讨如何使用System.IO.Compression命名空间下的ZipArchive类,...
在.NET框架中,C#程序员可以使用System.IO.Compression命名空间中的类来实现文件和文件夹的压缩与解压操作。这个命名空间包含了GZipStream、DeflateStream和ZipArchive等类,使得处理ZIP文件变得相当简单。下面我们...
总的来说,C#解压缩文件夹并保存目录结构是开发过程中的一项实用技能,结合ASP.NET可以构建强大的文件服务,结合SQLDBA知识可以优化数据库管理。京华志和精华志这样的社区提供了丰富的学习材料,鼓励开发者分享和...
在C#编程环境中,开发一个能够压缩和解压缩文件的程序是一项常见的任务,尤其是在处理大量数据存储和传输时...理解并熟练运用这些方法,你就能在VS2010或其他支持.NET Framework的环境中构建出功能完备的压缩解压工具。