递归实现压缩文件夹和子文件夹。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.IO.Compression;
using System.Collections;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary; namespace CommonBaseInfo
{
public class Zip
{ #region 压缩解压单一文件
/// <summary>
/// 压缩单一文件
/// </summary>
/// <param name="sourceFile">源文件路径</param>
/// <param name="destinationFile">目标文件路径</param>
public static void CompressFile(string sourceFile, string destinationFile)
{
if (!File.Exists(sourceFile)) throw new FileNotFoundException();
using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read))
{
byte[] buffer = new byte[sourceStream.Length];
int checkCounter = sourceStream.Read(buffer, , buffer.Length);
if (checkCounter != buffer.Length) throw new ApplicationException();
using (FileStream destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write))
{
using (GZipStream compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true))
{
compressedStream.Write(buffer, , buffer.Length);
}
}
}
}
public static void CompressFile(byte[] source, string destinationFile)
{
using (FileStream destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write))
{
using (GZipStream compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true))
{
compressedStream.Write(source, , source.Length);
}
}
} /// <summary>
/// 解压缩文件
/// </summary>
/// <param name="sourceFile">源文件路径</param>
/// <param name="destinationFile">目标文件路径</param>
public static void DecompressFile(string sourceFile, string destinationFile)
{
if (!File.Exists(sourceFile)) throw new FileNotFoundException();
using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open))
{
byte[] quartetBuffer = new byte[];
int position = (int)sourceStream.Length - ;
sourceStream.Position = position;
sourceStream.Read(quartetBuffer, , );
sourceStream.Position = ;
int checkLength = BitConverter.ToInt32(quartetBuffer, );
byte[] buffer = new byte[checkLength + ];
using (GZipStream decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true))
{
int total = ;
for (int offset = ; ; )
{
int bytesRead = decompressedStream.Read(buffer, offset, );
if (bytesRead == ) break;
offset += bytesRead;
total += bytesRead;
}
using (FileStream destinationStream = new FileStream(destinationFile, FileMode.Create))
{
destinationStream.Write(buffer, , total);
destinationStream.Flush();
}
}
}
} #endregion #region 压缩解压文件夹
/**/
/// <summary>
/// 对目标文件夹进行压缩,将压缩结果保存为指定文件
/// </summary>
/// <param name="dirPath">目标文件夹</param>
/// <param name="fileName">压缩文件</param>
/// public static void CompressFolderP(string dirPath, string fileName)
{
ArrayList list = new ArrayList();
CompressFolder(dirPath, fileName, dirPath,list); }
public static void CompressFolder(string dirPath, string fileName, string rootdir, ArrayList list)
{ foreach (string d in Directory.GetDirectories(dirPath))
{
byte[] destBuffer = null;
string path = d.Replace(rootdir, "");
SerializeFileInfo sfi = new SerializeFileInfo(d, destBuffer, "",path);
list.Add(sfi);
CompressFolder(d, fileName,rootdir,list); } foreach (string f in Directory.GetFiles(dirPath))
{ if ( (File.GetAttributes(f) & FileAttributes.Hidden) != FileAttributes.Hidden)
{
byte[] destBuffer = File.ReadAllBytes(f);
string path = f.Replace(rootdir, "");
SerializeFileInfo sfi = new SerializeFileInfo(f, destBuffer, "", path);
list.Add(sfi);
} } IFormatter formatter = new BinaryFormatter();
using (Stream s = new MemoryStream())
{
formatter.Serialize(s, list);
s.Position = ;
CreateCompressFile(s, fileName);
}
}
/**/
/// <summary>
/// 对目标压缩文件解压缩,将内容解压缩到指定文件夹
/// </summary>
/// <param name="fileName">压缩文件</param>
/// <param name="dirPath">解压缩目录</param>
/// public static void DeCompressFolder(string fileName, string dirPath)
{ if (!Directory.Exists(dirPath))
{
Directory.CreateDirectory(dirPath);
} using (Stream source = File.OpenRead(fileName))
{
using (Stream destination = new MemoryStream())
{
using (GZipStream input = new GZipStream(source, CompressionMode.Decompress, true))
{
byte[] bytes = new byte[];
int n;
while ((n = input.Read(bytes, , bytes.Length)) != )
{
destination.Write(bytes, , n);
}
}
destination.Flush();
destination.Position = ;
DeSerializeFiles(destination, dirPath);
}
}
}
private static void DeSerializeFiles(Stream s, string dirPath)
{
BinaryFormatter b = new BinaryFormatter();
ArrayList list = (ArrayList)b.Deserialize(s);
foreach (SerializeFileInfo f in list)
{
if (f.Fileflag == "")
{
string newName = dirPath + f.Filedirnane;
using (FileStream fs = new FileStream(newName, FileMode.Create, FileAccess.Write))
{
fs.Write(f.FileBuffer, , f.FileBuffer.Length);
fs.Close();
}
}
else
{
if (!Directory.Exists(dirPath+f.Filedirnane))
{
Directory.CreateDirectory(dirPath + f.Filedirnane);
} }
}
}
private static void CreateCompressFile(Stream source, string destinationName)
{
using (Stream destination = new FileStream(destinationName, FileMode.Create, FileAccess.Write))
{
using (GZipStream output = new GZipStream(destination, CompressionMode.Compress))
{
byte[] bytes = new byte[];
int n;
while ((n = source.Read(bytes, , bytes.Length)) != )
{
output.Write(bytes, , n);
}
}
}
} #endregion [Serializable]
class SerializeFileInfo
{
public SerializeFileInfo(string name, byte[] buffer,string flag,string dirname)
{
fileName = name;
fileBuffer = buffer;
fileflag = flag;
filedirnane = dirname;
}
string fileflag;
string filedirnane;
string fileName; public string Filedirnane
{
get
{
return filedirnane;
}
}
public string Fileflag
{
get
{
return fileflag;
}
} public string FileName
{
get
{
return fileName;
}
}
byte[] fileBuffer;
public byte[] FileBuffer
{
get
{
return fileBuffer;
}
}
}
}
}
 CommonBaseInfo.Zip.CompressFolderP(@"c:\debug", @"c:\debug.zip");
CommonBaseInfo.Zip.DeCompressFolder(@"c:\debug.zip", @"c:\debug\");

c# 压缩文件的更多相关文章

  1. 【VC++技术杂谈008】使用zlib解压zip压缩文件

    最近因为项目的需要,要对zip压缩文件进行批量解压.在网上查阅了相关的资料后,最终使用zlib开源库实现了该功能.本文将对zlib开源库进行简单介绍,并给出一个使用zlib开源库对zip压缩文件进行解 ...

  2. C#基础-压缩文件及故障排除

    C#压缩文件可以使用第三方dll库:ICSharpCode.SharpZipLib.dll: 以下代码能实现文件夹与多个文件的同时压缩.(例:把三个文件夹和五个文件一起压缩成一个zip) 直接上代码, ...

  3. 破解压缩文件密码rarcrack

    破解压缩文件密码rarcrack   常见的压缩文件格式有ZIP.RAR和7z.这三种格式都支持使用密码进行加密压缩.前面讲过破解ZIP压缩文件,可以使用fcrackzip.对于RAR和7z格式,可以 ...

  4. 文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件

    总结:                                                          使用PHP下载文件的操作需要给出四个header(),可以参考我的另一篇博文: ...

  5. java ZipOutputStream压缩文件,ZipInputStream解压缩

    java中实现zip的压缩与解压缩.java自带的 能实现的功能比较有限. 本程序功能:实现简单的压缩和解压缩,压缩文件夹下的所有文件(文件过滤的话需要对File进一步细节处理). 对中文的支持需要使 ...

  6. C# 压缩文件与字节互转

    public class ZipBin { public byte[] bytes; //C#读取压缩文件(将压缩文件转换为二进制 public void GetZipToByte(string in ...

  7. Linux如何复制,打包,压缩文件

    (1)复制文件 cp -r  要copy的文件/("/"指的是包括里面的内容)   newfile_name(要命名的文件名) eg:cp -r webapps_zero/   f ...

  8. java生成压缩文件

    在工作过程中,需要将一个文件夹生成压缩文件,然后提供给用户下载.所以自己写了一个压缩文件的工具类.该工具类支持单个文件和文件夹压缩.放代码: import java.io.BufferedOutput ...

  9. 7z压缩文件时排除指定的文件

    分享一个7z压缩文件时排除指定文件类型的命令行,感觉很有用: 7z a -t7z d:\updateCRM.7z d:\updateCRM\*.* -r -x!*.log -x!*bak a:创建压缩 ...

  10. [Java 基础] 使用java.util.zip包压缩和解压缩文件

    reference :  http://www.open-open.com/lib/view/open1381641653833.html Java API中的import java.util.zip ...

随机推荐

  1. 下载python标准库--python

    #coding:utf-8 import urllib2 import os,sys from BeautifulSoup import BeautifulSoup # For processing ...

  2. 网站建设中前端常用的jQuery+easing缓动的动画

    网站建设中前端人员利用jQuery实现动画再简单不过了,只是要实现更酷的效果还需要插件来帮忙,easing就是一款帮助jQuery实现缓动动画的插件,经过试用,效果很不错! 下载该插件:jquery. ...

  3. webstorm与SAE的svn仓库链接进行版本控制

    这里把我使用webstorm与SAE的svn仓库链接: 1.先得设置webstorm中的版本控制,File->Settings->Version Control->Subversio ...

  4. 用C语言写的双色球

    #include<stdio.h> #include<stdlib.h> #include<time.h> double jieguo(); void main() ...

  5. jsp_设置错误页

    在各个常用的web站点中,当一个页面出错后,会自动跳转到一个页面上进行错误信息的显示.下面我们说说这个操作是怎么实现的. 要想完成错误页的操作,在jsp页面必须满足两个条件: (1)指定错误出现时的跳 ...

  6. Linux内核分析之操作系统是如何工作的

    在本周的课程中,孟老师主要讲解了操作系统是如何工作的,我根据自己的理解写了这篇博客,请各位小伙伴多多指正. 一.知识点总结 1. 三个法宝 存储程序计算机:所有计算机基础性的逻辑框架. 堆栈:高级语言 ...

  7. spinner与arrays.xml的使用

    在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例: 把相应的数据放到values/arrays.xml文件里 <?xml version=" ...

  8. HTML编程

    通俗的解释:HTML是一个没有穿衣服的人 CSS是穿上了华丽衣服的人 JS是使这个人动起来 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万 ...

  9. 分享一段视频关于SQL2014 Hekaton数据库的

    分享一段视频关于SQL2014 Hekaton数据库的 Microsoft SQL Server In-Memory OLTP Project "Hekaton": App Dev ...

  10. 【基础知识】.Net基础加强11天

    一. 扩展方法 1. 声明扩展方法的步骤: 1> 类必须是static,方法是static ,第一个参数是被扩展的对象,前面标注(this 数据类型参数名). 2> 使用扩展方法的时候必须 ...