好库网 好库网首页 | 我的好库
好饱的专栏

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

发布者:好饱
发布日期:2012/8/10 11:39:17   更新日期:2012/8/11 20:53:12
阅读次数:17957
评分:4.80
介绍:介绍了压缩解压的两种方式:方法一、调用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命令行压缩。

 

 


评论 [发表评论]
账号 密码 还没帐号呢,现在注册一个?

免责声明:好库网所展示的信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。好库网不提供任何保证,并不承担任何法律责任。