如何在C#中压缩和解压rar、zip文件

这期内容当中小编将会给大家带来有关如何在C#中压缩和解压rar、zip文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

在C#.NET中压缩解压rar文件

rar格式是一种具有专利文件的压缩格式,是一种商业压缩格式,不开源,对解码算法是公开的,但压缩算法是私有的,需要付费,如果需要在您的商业软件中使用rar格式进行解压缩,那么你需要为rar付费,rar在国内很流行是由于盗版的存在,正因为算法是不开源的,所以我们压缩rar并没有第三方的开源库可供选择,只能另寻出路。

如何在C#中压缩和解压rar、zip文件

针对rar的解压缩,我们通常使用winrar,几乎每台机器都安装了winrar,对于普通用户来说它提供基于用户界面的解压缩方式,另外,它也提供基于命令行的解压缩方式,这为我们在程序中解压缩rar格式提供了一个入口,我们可以在C#程序中调用rar的命令行程序实现解压缩,思路是这样的:

1、判断注册表确认用户机器是否安装winrar程序,如果安装取回winrar安装目录。

2、创建一个命令行执行进程。

3、通过winrar的命令行参数实现解压缩。

首先我们通过下面的代码判断用户计算机是否安装了winrar压缩工具:

如果已经安装winrar可通过如下代码返回winrar的安装位置,未安装则返回空字符串,最后并关闭注册表:

publicstaticstringExistsWinRar()
{
stringresult=string.Empty;

stringkey=@"SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\WinRAR.exe";
RegistryKeyregistryKey=Registry.LocalMachine.OpenSubKey(key);
if(registryKey!=null)
{
result=registryKey.GetValue("").ToString();
}
registryKey.Close();

returnresult;
}
///<summary>
///将格式为rar的压缩文件解压到指定的目录
///</summary>
///<paramname="rarFileName">要解压rar文件的路径</param>
///<paramname="saveDir">解压后要保存到的目录</param>
publicstaticvoidDeCompressRar(stringrarFileName,stringsaveDir)
{
stringregKey=@"SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\WinRAR.exe";
RegistryKeyregistryKey=Registry.LocalMachine.OpenSubKey(regKey);
stringwinrarPath=registryKey.GetValue("").ToString();
registryKey.Close();
stringwinrarDir=System.IO.Path.GetDirectoryName(winrarPath);
StringcommandOptions=string.Format("x{0}{1}-y",rarFileName,saveDir);

ProcessStartInfoprocessStartInfo=newProcessStartInfo();
processStartInfo.FileName=System.IO.Path.Combine(winrarDir,"rar.exe");
processStartInfo.Arguments=commandOptions;
processStartInfo.WindowStyle=ProcessWindowStyle.Hidden;

Processprocess=newProcess();
process.StartInfo=processStartInfo;
process.Start();
process.WaitForExit();
process.Close();
}
///<summary>
///将目录和文件压缩为rar格式并保存到指定的目录
///</summary>
///<paramname="soruceDir">要压缩的文件夹目录</param>
///<paramname="rarFileName">压缩后的rar保存路径</param>
publicstaticvoidCompressRar(stringsoruceDir,stringrarFileName)
{
stringregKey=@"SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\WinRAR.exe";
RegistryKeyregistryKey=Registry.LocalMachine.OpenSubKey(regKey);
stringwinrarPath=registryKey.GetValue("").ToString();
registryKey.Close();
stringwinrarDir=System.IO.Path.GetDirectoryName(winrarPath);
StringcommandOptions=string.Format("a{0}{1}-r",rarFileName,soruceDir);

ProcessStartInfoprocessStartInfo=newProcessStartInfo();
processStartInfo.FileName=System.IO.Path.Combine(winrarDir,"rar.exe");
processStartInfo.Arguments=commandOptions;
processStartInfo.WindowStyle=ProcessWindowStyle.Hidden;
Processprocess=newProcess();
process.StartInfo=processStartInfo;
process.Start();
process.WaitForExit();
process.Close();
}

在C#.NET中压缩解压zip文件

zip是一种免费开源的压缩格式,windows平台自带zip压缩和解压工具,由于算法是开源的,所以基于zip的解压缩开源库也很多,SharpZipLib是一个很不错的C#库,它能够解压缩zip、gzip和tar格式的文件,首先下载SharpZipLib解压后,在您的项目中引用ICSharpCode.SharpZLib.dll程序集即可,下面是一些关于SharpZipLib压缩和解压的示例。

ZipOutputStreamzipOutStream=newZipOutputStream(File.Create("my.zip"));
CreateFileZipEntry(zipOutStream,"file1.txt","file1.txt");
CreateFileZipEntry(zipOutStream,@"folder1\folder2\folder3\file2.txt","file2.txt");
zipOutStream.Close();
Directory.CreateDirectory("ZipOutPut");
ZipInputStreamzipInputStream=newZipInputStream(File.Open("my.zip",FileMode.Open));
ZipEntryzipEntryFromZippedFile=zipInputStream.GetNextEntry();
while(zipEntryFromZippedFile!=null)
{
if(zipEntryFromZippedFile.IsFile)
{
FileInfofInfo=newFileInfo(string.Format("ZipOutPut\\{0}",zipEntryFromZippedFile.Name));
if(!fInfo.Directory.Exists)fInfo.Directory.Create();

FileStreamfile=fInfo.Create();
byte[]bufferFromZip=newbyte[zipInputStream.Length];
zipInputStream.Read(bufferFromZip,0,bufferFromZip.Length);
file.Write(bufferFromZip,0,bufferFromZip.Length);
file.Close();
}
zipEntryFromZippedFile=zipInputStream.GetNextEntry();
}
zipInputStream.Close();

使用.NET中自带的类解压缩zip文件

微软在System.IO.Compression命名空间有一些关于文件解压缩的类,如果只是希望压缩解压zip和gzip格式的文件,是个不错的选择,在NET Framework 4.5框架中,原生System.IO.Compression.FileSystem.dll程序集中新增了一个名为ZipFile的类,,让压缩和解压zip文件变得更简单,ZipFile的使用示例如下:

System.IO.Compression.ZipFile.CreateFromDirectory(@"e:\test",@"e:\test\test.zip");//压缩
System.IO.Compression.ZipFile.ExtractToDirectory(@"e:\test\test.zip",@"e:\test");//解压

支持格式最多的C#解压缩开源库

当您还苦苦在为上面的各种压缩格式发愁的时候,一个名为SharpCompress的C#框架被开源,您可以在搜索引擎中找到SharpCompress框架的开源代码,它支持:rar 7zip, zip, tar, tzip和bzip2格式的压缩和解压,下面的示例直接从rar格式文件读取并解压文件。

using(Streamstream=File.OpenRead(@"C:\Code\sharpcompress.rar"))
{
varreader=ReaderFactory.Open(stream);
while(reader.MoveToNextEntry())
{
if(!reader.Entry.IsDirectory)
{
Console.WriteLine(reader.Entry.FilePath);
reader.WriteEntryToDirectory(@"C:\temp");
}
}
}

总结

关于rar和zip格式相比,rar的压缩率比zip要高,而且支持分卷压缩,但rar是商业软件,需要付费,zip压缩率不如rar那么高,但开源免费,7zip格式开源免费,压缩率较为满意,这些压缩格式各有优势,就微软平台和一些开源平台来说,一般采用的都是zip格式,因为它更容易通过编程的方式实现,比rar更加可靠。

///<summary>
///解压RAR和ZIP文件(需存在Winrar.exe(只要自己电脑上可以解压或压缩文件就存在Winrar.exe))
///</summary>
///<paramname="UnPath">解压后文件保存目录</param>
///<paramname="rarPathName">待解压文件存放绝对路径(包括文件名称)</param>
///<paramname="IsCover">所解压的文件是否会覆盖已存在的文件(如果不覆盖,所解压出的文件和已存在的相同名称文件不会共同存在,只保留原已存在文件)</param>
///<paramname="PassWord">解压密码(如果不需要密码则为空)</param>
///<returns>true(解压成功);false(解压失败)</returns>
publicstaticboolUnRarOrZip(stringUnPath,stringrarPathName,boolIsCover,stringPassWord)
{
if(!Directory.Exists(UnPath))
Directory.CreateDirectory(UnPath);
ProcessProcess1=newProcess();
Process1.StartInfo.FileName="Winrar.exe";
Process1.StartInfo.CreateNoWindow=true;
stringcmd="";
if(!string.IsNullOrEmpty(PassWord)&&IsCover)
//解压加密文件且覆盖已存在文件(-p密码)
cmd=string.Format("x-p{0}-o+{1}{2}-y",PassWord,rarPathName,UnPath);
elseif(!string.IsNullOrEmpty(PassWord)&&!IsCover)
//解压加密文件且不覆盖已存在文件(-p密码)
cmd=string.Format("x-p{0}-o-{1}{2}-y",PassWord,rarPathName,UnPath);
elseif(IsCover)
//覆盖命令(x-o+代表覆盖已存在的文件)
cmd=string.Format("x-o+{0}{1}-y",rarPathName,UnPath);
else
//不覆盖命令(x-o-代表不覆盖已存在的文件)
cmd=string.Format("x-o-{0}{1}-y",rarPathName,UnPath);
//命令
Process1.StartInfo.Arguments=cmd;
Process1.Start();
Process1.WaitForExit();//无限期等待进程winrar.exe退出
//Process1.ExitCode==0指正常执行,Process1.ExitCode==1则指不正常执行
if(Process1.ExitCode==0)
{
Process1.Close();
returntrue;
}
else
{
Process1.Close();
returnfalse;
}

}

///<summary>
///压缩文件成RAR或ZIP文件(需存在Winrar.exe(只要自己电脑上可以解压或压缩文件就存在Winrar.exe))
///</summary>
///<paramname="filesPath">将要压缩的文件夹或文件的绝对路径</param>
///<paramname="rarPathName">压缩后的压缩文件保存绝对路径(包括文件名称)</param>
///<paramname="IsCover">所压缩文件是否会覆盖已有的压缩文件(如果不覆盖,所压缩文件和已存在的相同名称的压缩文件不会共同存在,只保留原已存在压缩文件)</param>
///<paramname="PassWord">压缩密码(如果不需要密码则为空)</param>
///<returns>true(压缩成功);false(压缩失败)</returns>
publicstaticboolCondenseRarOrZip(stringfilesPath,stringrarPathName,boolIsCover,stringPassWord)
{
stringrarPath=Path.GetDirectoryName(rarPathName);
if(!Directory.Exists(rarPath))
Directory.CreateDirectory(rarPath);
ProcessProcess1=newProcess();
Process1.StartInfo.FileName="Winrar.exe";
Process1.StartInfo.CreateNoWindow=true;
stringcmd="";
if(!string.IsNullOrEmpty(PassWord)&&IsCover)
//压缩加密文件且覆盖已存在压缩文件(-p密码-o+覆盖)
cmd=string.Format("a-ep1-p{0}-o+{1}{2}-r",PassWord,rarPathName,filesPath);
elseif(!string.IsNullOrEmpty(PassWord)&&!IsCover)
//压缩加密文件且不覆盖已存在压缩文件(-p密码-o-不覆盖)
cmd=string.Format("a-ep1-p{0}-o-{1}{2}-r",PassWord,rarPathName,filesPath);
elseif(string.IsNullOrEmpty(PassWord)&&IsCover)
//压缩且覆盖已存在压缩文件(-o+覆盖)
cmd=string.Format("a-ep1-o+{0}{1}-r",rarPathName,filesPath);
else
//压缩且不覆盖已存在压缩文件(-o-不覆盖)
cmd=string.Format("a-ep1-o-{0}{1}-r",rarPathName,filesPath);
//命令
Process1.StartInfo.Arguments=cmd;
Process1.Start();
Process1.WaitForExit();//无限期等待进程winrar.exe退出
//Process1.ExitCode==0指正常执行,Process1.ExitCode==1则指不正常执行
if(Process1.ExitCode==0)
{
Process1.Close();
returntrue;
}
else
{
Process1.Close();
returnfalse;
}

}

上述就是小编为大家分享的如何在C#中压缩和解压rar、zip文件了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。

发布于 2021-05-10 20:38:24
收藏
分享
海报
0 条评论
171
上一篇:64位linux编译c提示gnu/stubs-32.h:No such file or directory错误怎么办 下一篇:python中for x in range如何使用
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码