说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

c#对rar或zip文件进行压缩解压缩

HTML文档下载 WORD文档下载 PDF文档下载
介绍了压缩解压的两种方式:方法一、调用WinRAR方式,方法二、使用C#压缩解压库

 

方法一、调用WinRAR方式

此部分内容参考自:http://hi.baidu.com/dukey/item/dd91b30c47f0d07ebee97ea5

 

/// <summary>/// 利用 WinRAR 进行压缩/// </summary>/// <param name="path">将要被压缩的文件夹(绝对路径)</param>/// <param name="rarPath">压缩后的 .rar 的存放目录(绝对路径)</param>/// <param name="rarName">压缩文件的名称(包括后缀)</param>/// <returns>true 或 false。压缩成功返回 true,反之,false。</returns>public bool RAR(string path, string rarPath, string rarName){	bool flag = false;	string rarexe;       //WinRAR.exe 的完整路径	RegistryKey regkey;  //注册表键	Object regvalue;     //键值	string cmd;          //WinRAR 命令参数	ProcessStartInfo startinfo;	Process process;	try	{		regkey = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRAR.exe\shell\open\command");		regvalue = regkey.GetValue("");  // 键值为 "d:\Program Files\WinRAR\WinRAR.exe" "%1"		rarexe = regvalue.ToString();    		regkey.Close();		rarexe = rarexe.Substring(1, rarexe.Length - 7);  // d:\Program Files\WinRAR\WinRAR.exe		Directory.CreateDirectory(path);		path = "\"" + path + "\"";		//压缩命令,相当于在要压缩的文件夹(path)上点右键->WinRAR->添加到压缩文件->输入压缩文件名(rarName)		cmd = string.Format("a {0} {1} -ep1 -o+ -inul -r -ibck",							rarName,							path);		startinfo = new ProcessStartInfo();		startinfo.FileName = rarexe;		startinfo.Arguments = cmd;                          //设置命令参数		startinfo.WindowStyle = ProcessWindowStyle.Hidden;  //隐藏 WinRAR 窗口		startinfo.WorkingDirectory = rarPath;		process = new Process();		process.StartInfo = startinfo;		process.Start();		process.WaitForExit(); //无限期等待进程 winrar.exe 退出		if (process.HasExited)		{			flag = true;		}		process.Close();	}	catch (Exception e)	{		throw e;	}	return flag;}/// <summary>/// 利用 WinRAR 进行解压缩/// </summary>/// <param name="path">文件解压路径(绝对)</param>/// <param name="rarPath">将要解压缩的 .rar 文件的存放目录(绝对路径)</param>/// <param name="rarName">将要解压缩的 .rar 文件名(包括后缀)</param>/// <returns>true 或 false。解压缩成功返回 true,反之,false。</returns>public bool UnRAR(string path, string rarPath, string rarName){	bool flag = false;	string rarexe;	RegistryKey regkey;	Object regvalue;	string cmd;	ProcessStartInfo startinfo;	Process process;	try	{		regkey = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRAR.exe\shell\open\command");		regvalue = regkey.GetValue("");		rarexe = regvalue.ToString();		regkey.Close();		rarexe = rarexe.Substring(1, rarexe.Length - 7);		Directory.CreateDirectory(path);		//解压缩命令,相当于在要压缩文件(rarName)上点右键->WinRAR->解压到当前文件夹		cmd = string.Format("x {0} {1} -y",							rarName,							path);		startinfo = new ProcessStartInfo();		startinfo.FileName = rarexe;		startinfo.Arguments = cmd;		startinfo.WindowStyle = ProcessWindowStyle.Hidden;		startinfo.WorkingDirectory = rarPath;		process = new Process();		process.StartInfo = startinfo;		process.Start();		process.WaitForExit();		if (process.HasExited)		{			flag = true;		}		process.Close();	}	catch (Exception e)	{		throw e;	}	return flag;}

 

注意:如果路径中有空格(如:D:\Program Files\)的话压缩解压就会出现问题,需要在path 和 rarName 上加双引号,如: path = "\"" + path + "\""; 

 

附:RAR参数:

一、压缩命令

 

1、常用压缩参数

rar a -ep1 -o+ -inul -r -ibck temp.rar "c:\test\*.*"

 

ep1:排除基准文件夹,不然压缩包会包含待压缩文件夹所在的完整路径

o+:覆盖已经存在的文件

inul:禁止出错信息

r:连同子文件夹操作

ibck:后台模式运行

 

 

2、将temp.txt压缩为temp.rar: rar a temp.rar temp.txt 

3、将当前目录下所有文件压缩到temp.rar: rar a temp.rar *.* 

4、将当前目录下所有文件及其所有子目录压缩到temp.rar: rar a temp.rar *.* -r 

5、将当前目录下所有文件及其所有子目录压缩到temp.rar,并加上密码123rar a temp.rar *.* -r -p123

 

二、解压命令

1、将temp.rar解压到c:\temp目录rar e temp.rar c:\temprar e *.rar c:\temp(支持批量操作) 

2、将temp.rar解压到c:\temp目录,并且解压后的目录结构和temp.rar中的目录结构一

 

压缩目录test及其子目录的文件内容 

Wzzip test.zip test -r -P 

WINRAR A test.rar test -r 

 

删除压缩包中的*.txt文件 

Wzzip test.zip *.txt -d 

WinRAR d test.rar *.txt 

 

刷新压缩包中的文件,即添加已经存在于压缩包中但更新的文件 

Wzzip test.zip test -f 

Winrar f test.rar test 

 

更新压缩包中的文件,即添加已经存在于压缩包中但更新的文件以及新文件 

Wzzip test.zip test -u 

Winrar u test.rar test 

 

移动文件到压缩包,即添加文件到压缩包后再删除被压缩的文件 

Wzzip test.zip -r -P -m 

Winrar m test.rar test -r 

 

添加全部 *.exe 文件到压缩文件,但排除有 a或b 

开头名称的文件 

Wzzip test *.exe -xf*.* -xb*.* 

WinRAR a test *.exe -xf*.* -xb*.* 

 

加密码进行压缩 

Wzzip test.zip test 

-s123。注意密码是大小写敏感的。在图形界面下打开带密码的压缩文件,会看到+号标记(附图1)。 

WINRAR A test.rar test -p123 

-r。注意密码是大小写敏感的。在图形界面下打开带密码的压缩文件,会看到*号标记(附图2)。 

 

按名字排序、以简要方式列表显示压缩包文件 

Wzzip test.zip -vbn 

Rar l test.rar 

 

锁定压缩包,即防止未来对压缩包的任何修改 

无对应命令 

Winrar k test.rar 

 

 

创建360kb大小的分卷压缩包 

无对应命令 

Winrar a -v360 test 

 

 

带子目录信息解压缩文件 

Wzunzip test -d 

Winrar x test -r 

 

不带子目录信息解压缩文件 

Wzunzip test 

Winrar e test 

 

解压缩文件到指定目录,如果目录不存在,自动创建 

Wzunzip test newfolder 

Winrar x test newfolder 

 

解压缩文件并确认覆盖文件 

Wzunzip test -y 

Winrar x test -y 

 

解压缩特定文件 

Wzunzip test *.txt 

Winrar x test *.txt 

 

解压缩现有文件的更新文件 

Wzunzip test -f 

Winrar x test -f 

 

解压缩现有文件的更新文件及新文件 

Wzunzip test -n 

Winrar x test -u 

 

批量解压缩文件 

Wzunzip *.zip 

WinRAR e *.rar

 

方法二、使用C#压缩解压库

SharpCompress是一个开源的压缩解压库,可以对RAR,7Zip,Zip,Tar,GZip,BZip2进行处理。

官方网址:http://sharpcompress.codeplex.com/

 

使用例子:

RAR文件解压缩:

 

using (Stream stream = File.OpenRead(@"C:\Code\sharpcompress.rar")){	var reader = ReaderFactory.Open(stream);	while (reader.MoveToNextEntry())	{		if (!reader.Entry.IsDirectory)		{			Console.WriteLine(reader.Entry.FilePath);			reader.WriteEntryToDirectory(@"C:\temp", ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);		}	}}

 

 

 

ZIP文件解压缩:

 

 

var archive = ArchiveFactory.Open(@"C:\Code\sharpcompress\TestArchives\sharpcompress.zip");foreach (var entry in archive.Entries){	if (!entry.IsDirectory)	{		Console.WriteLine(entry.FilePath);		entry.WriteToDirectory(@"C:\temp", ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);	}}

 

 

 

压缩为ZIP文件:

 

 

using (var archive = ZipArchive.Create()){	archive.AddAllFromDirectoryEntry(@"C:\\source");	archive.SaveTo("@C:\\new.zip");}

 

 

 

用Writer API创建ZIP文件

 

 

using (var zip = File.OpenWrite("C:\\test.zip"))using (var zipWriter = WriterFactory.Open(ArchiveType.Zip, zip)){     foreach (var filePath in filesList)     {        zipWriter.Write(Path.GetFileName(file), filePath);     }}

 

 

 

创建tar.bz2

 

 

using (Stream stream = File.OpenWrite(tarPath))using (var writer = WriterFactory.Open(ArchiveType.Tar, stream)){	writer.WriteAll(filesPath, "*", SearchOption.AllDirectories);}using (Stream stream = File.OpenWrite(tarbz2Path))using (var writer = WriterFactory.Open(ArchiveType.BZip2, stream)){	writer.Write("Tar.tar", tarPath);}

 

我们看到SharpCompress是没有压缩为rar的命令,因为所有RAR压缩文件都需要RAR作者的许可,你可以考虑压缩为zip或7zip,要不就使用WINRAR命令行压缩。

 

 

如何设计优雅的移动游戏? 前方高能!盘点2014年最颠覆三观的智能硬件 俄罗斯当局封杀GitHub,理由是教唆自杀 裁员110人、关闭工作室,Rovio重组求出路! 全Swift开发、代码开源!有钳的Firefox for iOS 详解开源游戏开发框架HaxePunk的主要特性 《程序员》杂志休刊通知 2014 TOP50最具价值CTO获奖名单揭晓! TIOBE 2014年12月编程语言排行榜:R和Swift成为年度语言候选者 免费增值应用正在“杀死”游戏开发者? 直接Mark!开源的DevOps开发工具箱 Apache Mesos联合创始人Benjamin Hindman:谈分布式应用现状 直觉不靠谱!使用移动应用分析的七个巧妙方法 屏蔽、挖角与丑闻,Uber的“创收神器”泡沫 蚁视科技发布会:三大产品与四大概念技术 盘点VS2015 预览版的5个新特性 低能的“智能” 你就是明星,第一届IBM RockStar正式启动! Kubernetes:Google分布式容器技术初体验 方法可以复制 AngularJS资源集合 那些年,微信走过的开放之路 从YunOS话阿里移动互联网云生态布局 Mobile First!苹果联合IBM发布10款企业级App iOS8.1.1越狱又惹急苹果!扒一扒黑客与苹果的斗争史! Firefox.html:用HTML重现Firefox UI Qt 5.4正式发布!引入WP,支持HTML5混合开发 2014智能硬件盘点第二弹!这次咱走暖心的 聚合数据资产,推动产业创新——2014中关村大数据日看大数据变现 拥抱开源:微软Windows 10宣布全面支持AllJoyn技术 改变App领域发展!友盟推“数据工场”战略,两款新品亮相 Cloudera正式登陆中国市场:与英特尔携手共助本土企业淘金大数据 vs.net 在沈阳有好用的D版吗?我换了两次了,可还是不好用!! IBM TP600硬盘加密问题!!!在线等待 求教!!! 我爱吃 鲜美的西瓜、苹果等…… cell帮忙来看一下 关于事务处理的问题! pb中解析xml的问题? 使用DrawText在窗口上画出几行字(带DT_WORDBREAK风格),请问如何知道其中任一字符的坐标值 送分小问题:客户端与服务器 谁能给我几个经典一点的directx方面的2d游戏例子吗 我毕业设计要用java做一个软件,能够实现信息隐藏技术,谁有这方面的经验?谢谢。100分 无比痛苦的我~~~~!! CEdit & CRichEdit 怎么调用flash文件 【【【简单的问题,只是我不知道而已 也不知现在那个版本的VS。ENT中文正式版要好点??? 关于DCOM的应用系统分发的简单问题! IBM TP600硬盘加密问题!!!在线等待 关于Linux下配置邮件服务器 哪里有适合delphi6的控健(包括fastreport)可以下载? 设备无关位图的数据,为什么与显示在屏幕上的RGB不一样,高手不一定会! 什么防火墙比较好???? 能用到存储过程吗? 如何操作动态连接库! 征求兼职,简单的数据库项目,要求人在上海。 怪问题送分 第五把钥匙 两台属于不同域的都安装的活动目录的服务器,如何建立域间的信任关系 一个delphi combobox的问题! WebControl中包含的中文字显示不正常? 怎样读取注册表中的数据呢? 刚刚写好一个 NT/2000/XP 的 backdoor (反向连接,插入系统进程,通讯加密) 愚人节千万别上厕所(刚看到的,转) 散 分! 高手进行,绝对给分! 继续上一个问题提问,关于动态窗体 不能加载控件dbgrid32?????许可证末找到??? 美萍反黄专家技术大讨论! Linux与四系统并存启动 怎么追这个很正点的女孩啊。请教。。。 急啊,连接数据库(online 请教MPEG4编辑问题 我的操作系统是2000,请问如何调整虚拟内存的大小? 谢谢詹维,请进来 java汉字显示乱码问题?? 我想自己编写一个画线的函数,不用mfc中的,而且速度要比mfc快,所以我想直接操纵缓存,请问怎么做? SQL SERVER2000中数据转换问题? 一个很奇怪的问题!高手请进! postdata.att文件用什么软件打开! 组网 我的网站怎么了? 角a分别是 一 二 三 四象限的角 请问 1/2a分别是第几象限的角,并附上详细解析和关系式—————— 已知a为第三象限角,则a/2所在的象限为?需要理由, 执行下述语句后,a,b,m,n变量的值分别为?int a=1,b=2,c=3,d=4,m=5,n=6;a = ( m=a>b ) && ( n =c>d ) || ++a = = b--; 已知A(1,2) B(m,6),若向量OA垂直向量AB,则实数m的值为?两个向量相乘=坐标相乘?不是向量a ×向量b=向量a的模×向量b的模×cos(夹角) 已知a是第三象限角,则a/3是第几象限角?请写详细一点 若int a=4;则执行语句a+=a- =a+4后变量a的值是什么,答案是-8,a+,a-是什么, 已知A(1,2) B(m,6),若向量OA垂直向量AB,则实数m的值为? 已知a为第三象限角,则a/2所在的象限是?本人甚愚,请给出详细些的说明答案是有两个象限 若int a=4;则执行语句a+=a- =a+4后变量a的值是 若a是第二象限角,则a/2是第几象限角? w,x,y为正整型变量,以下switch语句为何不正确switch(pow(x,2)+pow(y,2)){case 1:case 3:w=x+y;break;case 0:case 5:w=y-x;} 设F1,F2是椭圆C1:x平方/6+y平方/2=1的焦点,P是双曲线C2:x平方/3-y平方=1与C1的一个交点,求向量PF1*向量PF2/绝对值向量PF1*绝对值向量PF2 的值 fortran语言 DATA数组赋值问题 DIMENSION A(4,3) DATA A/3*-1.0,3*-2.0,3*-3.0,3*-4.0/请教A(1,1)A(1,2)A(1,3)这些数组的值赋给的是多少? 已知 a为第三象限角,则a/2所在的象限是A、第一或第二象限 B、第二或第三象限 C、第一或第三象限 D、第二或第四象限 问一个关于英语所有格的问题?“表示无生命的东西的名词一般与'of'构成短语表示所有关系.” 这里的“无生命的东西”是指of前面名词的还是所有者?无语了,误导我了。 α为第四象限角,则2α在第几象限 把吹鼓的气球在毛衣或头发上反复摩擦.把一个空可乐罐放在桌上,气球放到可乐罐旁接触.空可乐罐会怎样?30分钟内急需!*o* 已知F1,F2是椭圆C1:x^2/4+y^2=1与双曲线C2的公共焦点,A是C1,C2在第一象限的公共点,若向量AF1*AF2=0,则C2的离心率是 谁能把每句fortran语言都给我翻译一下integer row,i,j,k,nreal sreal,dimension(:,:),allocatable::a,l,ureal,dimension(:),allocatable::b,x,yread*,rowallocate(a(row,row))read*,((a(i,j),j=1,row),i=1,row)allocate(b(row))read*,(b(i),i=1,row)alloc 把吹鼓的气球在毛衣或头发上反复摩擦.把一个空可乐罐放在桌上,气球放在可乐罐旁边(两者不能互相接触)慢慢移动气球,空可乐罐会怎么样呢?把结果写下来 英语语法题,请说明其它选项为何是错的.名词的格,何时用“名词+of+名词”,何时用“of+名词的所有格”1.Are you sure that the blue umbrella is the____?A.jone's B.Joneses' C.Joneses D.Jones'B (为什么不能是D,B和 以下程序段执行后,m,n的值分别为( ). int m,n=4; m=n++; A)4,5 B)4,4 C)5,5 D)5,4以下程序段执行后,m,n的值分别为( ).  int m,n=4; m=n++;  A)4,5 B)4,4 C)5,5 D)5,4 a是第二象限角,a/3为第几象限角 为什么将一个气球在头发上摩擦几下,再拿到一个手臂旁,气球不会掉下来?请四楼 不要说理论,就回答这个问题。 设函数f(x)=2^(|x+1|-|x-1|),求使f(x)≥2根号2 的x的取值范围 关于fortran语言中if语句的简单问题DO I=1,LAIF(I-19) 1,1,21 FCOS = 90 - 5 * (I-1)GOTO 32 FCOS = 5 * (I-1) - 903 CONTINUEFCOS = .01745*FCOSACOS(I) = COS(FCOS)ACOS(I) = C*ACOS(I) * ACOS(I)END DO我想知道这个if语句是怎么执行的,那 函数y=根号1-x2/(x+3的绝对值—3)的奇偶性如题 设函数f(x)=2^(|x+1|-|x-1|),求使f(x)>=2倍根号2x的取值范围 FORTRAN语言中两个嵌套的DO语句在同一行结束,变量是如何变化的?比如:DO 30 K=1,2 DO 30 J=1,2 (无关紧要的运算)30 CONTINUE是按照(K=1,J=1)(K=1,J=2)(K=2,J=1)(K=2,J=2)的顺序变化还是按照(K=1,J=1 描写雨的完整古诗2首 关于一道C题目 (25)以下程序完全正确的是 A)int *p; scanf(“%d”,&p); B)int *p; scanf(“%d”,p); C) in #include < stdio.h > main() { int m,n; scanf("%d%d",&m,&n); while (m!=n) { while(m>n) m=m-n;while(m 可口可乐没有拧开盖子前瓶子内气压是多大? 描写雨的词语 C语言:关于有符号整型变量范围的问题为什么有符号整形变量的范围是-32768~32767 而不是-32767~32767呢?在TC系统下,一个有符号整型变量占两个字节,即有16个2进制位.除去第一位表示正负,剩下15 向量叉乘方向为什么用右手定则来判定 已知向量a,b,且|a|=4,|b|=3,(2a-3b)×(2a+b)=61 (1)求a与b的夹角o (2)求|a+b|和|a-b| 若点B(a,a-3)在第二象限和第四象限的角平分线上,则a= 已知sina=2/3,cosb=-1/4,a b为相邻象限的角,求sin(a=b)与sin(a-b)的值求sin(a+b)与sin(a-b) main() { int r,m,n,t; scanf("%d%d",&m,&n); if(m 若α为第四象限角,则2α,α/3,α/2为第几象限角 已知Sin(a+b)=4/5,cosb=-1/3,a属于第一象限,b属于第二象限求Sina 是多少 一着急 忘了 请说清楚 描写雨的词语有哪些 若a是第二象限角,则a/3所在象限是? 已知sina=2/3,cosb=-3/4,且a,b都是第二象限角,求sin(a+b),sin(a-b)的值得数 还要清楚过程 main () {int m,n; scanf ("%d%d",&m,&n); while (m!=n) { while(m>n) m-=n; while(n>m) m-=m; }printf("m=%d\n",m)}如果键盘上输入65 14 结果是? 瓶子里的气球把一只气球塞进瓶子,气球口拉出瓶口.如果你现在开始往瓶子里吹气,你认为你能把气球吹得充满整个瓶子的体积 (2)已知sina=2/3,cosB=-3/4,且a、B都是第二象限角,求sin(a-B)的值 描写雨的词语有 将一只气球塞进瓶里,气球嘴翻套在瓶口中,然后向气球吹气,可无论你怎么用力吹,瓶里的气球不能充满瓶子为什么会这样,不用多说. 已知sina=1/3,a是第二象限角,cosb=-1/2,b是第三象限角,求sin(a+b)的值 高一数学分别写出第一,二,三,四象限角的集合 用力吹瓶子里的气球, 描写雨的古诗? 已知a为第三象限的角a/2在第几象限他有俩个答案 已知向量a=(m,1),向量b=(-1,2),若a垂直b,则实数m的值是____ 若已知int i=8,j=10,m,n;请写出执行如下语句m=++i;n=j--;后变量i,j.m.n的值 已知角α在第四象限,求角二分之α,三分之α,2α所在的象限 已知向量a=(-2,1,3),向量b=(-1,2,1)若向量a⊥(向量a - m向量b),则实数m的值 描写雨的诗要整首诗!急
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘