C#压缩或解压rar、zip⽂件⽅法实例
前⾔
为了便于⽂件在⽹络中的传输和保存,通常将⽂件进⾏压缩操作,常⽤的压缩格式有rar、zip和7z,本⽂将介绍在C#中如何对这⼏种类型的⽂件进⾏压缩和解压,并提供⼀些在C#中解压缩⽂件的开源库。
在C#.NET中压缩解压rar⽂件
rar格式是⼀种具有专利⽂件的压缩格式,是⼀种商业压缩格式,不开源,对解码算法是公开的,但压缩算法是私有的,需要付费,如果需要在您的商业软件中使⽤rar格式进⾏解压缩,那么你需要为rar付费,rar在国内很流⾏是由于盗版的存在,正因为算法是不开源的,所以我们压缩rar并没有第三⽅的开源库可供选择,只能另寻出路。
针对rar的解压缩,我们通常使⽤winrar,⼏乎每台机器都安装了winrar,对于普通⽤户来说它提供基于⽤户界⾯的解压缩⽅式,另外,它也提供基于命令⾏的解压缩⽅式,这为我们在程序中解压缩rar格式提供了⼀个⼊⼝,我们可以在C#程序中调⽤rar的命令⾏程序实现解压缩,思路是这样的:
1、判断注册表确认⽤户机器是否安装winrar程序,如果安装取回winrar安装⽬录。
2、创建⼀个命令⾏执⾏进程。
3、通过winrar的命令⾏参数实现解压缩。
⾸先我们通过下⾯的代码判断⽤户计算机是否安装了winrar压缩⼯具:
如果已经安装winrar可通过如下代码返回winrar的安装位置,未安装则返回空字符串,最后并关闭注册表:
public static string ExistsWinRar()
{
string result = string.Empty;
string key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App ";
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(key);
if (registryKey != null)
{
result = registryKey.GetValue("").ToString();
}
registryKey.Close();
return result;
}
/// <summary>
/// 将格式为rar的压缩⽂件解压到指定的⽬录
/// </summary>
/// <param name="rarFileName">要解压rar⽂件的路径</param>
/// <param name="saveDir">解压后要保存到的⽬录</param>
public static void DeCompressRar(string rarFileName, string saveDir)
{
string regKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App ";
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(regKey);
string winrarPath = registryKey.GetValue("").ToString();
registryKey.Close();
string winrarDir = System.IO.Path.GetDirectoryName(winrarPath);
String commandOptions = string.Format("x {0} {1} -y", rarFileName, saveDir);
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = System.IO.Path.Combine(winrarDir, "");
processStartInfo.Arguments = commandOptions;
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process process = new Process();
process.StartInfo = processStartInfo;
process.Start();
process.WaitForExit();
process.Close();
}
/// <summary>
/// 将⽬录和⽂件压缩为rar格式并保存到指定的⽬录
/// </summary>
/// <param name="soruceDir">要压缩的⽂件夹⽬录</param>
/// <param name="rarFileName">压缩后的rar保存路径</param>
public static void CompressRar(string soruceDir, string rarFileName)
{
string regKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App ";
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(regKey);
string winrarPath = registryKey.GetValue("").ToString();
registryKey.Close();
string winrarDir = System.IO.Path.GetDirectoryName(winrarPath);
String commandOptions = string.Format("a {0} {1} -r", rarFileName, soruceDir);
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = System.IO.Path.Combine(winrarDir, "");
processStartInfo.Arguments = commandOptions;
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process process = new Process();
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压缩和解压的⽰例。
ZipOutputStream zipOutStream = new ZipOutputStream(File.Create("my.zip"));
CreateFileZipEntry(zipOutStream, "", "");
CreateFileZipEntry(zipOutStream, @"folder1\folder2\", "");
zipOutStream.Close();
Directory.CreateDirectory("ZipOutPut");
ZipInputStream zipInputStream = new ZipInputStream(File.Open("my.zip", FileMode.Open));
ZipEntry zipEntryFromZippedFile = zipInputStream.GetNextEntry();
while (zipEntryFromZippedFile != null)
{
if (zipEntryFromZippedFile.IsFile)
{
FileInfo fInfo = new FileInfo(string.Format("ZipOutPut\\{0}", zipEntryFromZippedFile.Name));
if (!fInfo.Directory.Exists) fInfo.Directory.Create();
FileStream file = fInfo.Create();
byte[] bufferFromZip = new byte[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 (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");
}
}
}
总结
关于rar和zip格式相⽐,rar的压缩率⽐zip要⾼,⽽且⽀持分卷压缩,但rar是商业软件,需要付费,zip压缩率不如rar那么⾼,但开源免
费,7zip格式开源免费,压缩率较为满意,这些压缩格式各有优势,就微软平台和⼀些开源平台来说,⼀般采⽤的都是zip格式,因为它更容易通过编程的⽅式实现,⽐rar更加可靠。
/// <summary>
/// 解压RAR和ZIP⽂件(需存在(只要⾃⼰电脑上可以解压或压缩⽂件就存在))
/// </summary>
/// <param name="UnPath">解压后⽂件保存⽬录</param>
/// <param name="rarPathName">待解压⽂件存放绝对路径(包括⽂件名称)</param>
/// <param name="IsCover">所解压的⽂件是否会覆盖已存在的⽂件(如果不覆盖,所解压出的⽂件和已存在的相同名称⽂件不会共同存在,只保留原已存在⽂件)</param>
/// <param name="PassWord">解压密码(如果不需要密码则为空)</param>
/
// <returns>true(解压成功);false(解压失败)</returns>
public static bool UnRarOrZip( string UnPath, string rarPathName, bool IsCover, string PassWord)
{
if (!Directory.Exists(UnPath))
Directory.CreateDirectory(UnPath);
Process Process1 = new Process();
Process1.StartInfo.FileName = "" ;
Process1.StartInfo.CreateNoWindow = true ;
string cmd = "" ;
if (! string .IsNullOrEmpty(PassWord) && IsCover)
//解压加密⽂件且覆盖已存在⽂件( -p密码 )
cmd = string .Format( " x -p{0} -o+ {1} {2} -y" , PassWord, rarPathName, UnPath);
else if (! string .IsNullOrEmpty(PassWord) && !IsCover)
//解压加密⽂件且不覆盖已存在⽂件( -p密码 )
cmd = string .Format( " x -p{0} -o- {1} {2} -y" , PassWord, rarPathName, UnPath);
else if (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(); //⽆限期等待进程 退出
//Process1.ExitCode==0指正常执⾏,Process1.ExitCode==1则指不正常执⾏
gzip是什么文件夹if (Process1.ExitCode == 0)
{
Process1.Close();
return true ;
}
else
{
Process1.Close();
return false ;
}
}
/// <summary>
/// 压缩⽂件成RAR或ZIP⽂件(需存在(只要⾃⼰电脑上可以解压或压缩⽂件就存在))
/// </summary>
/// <param name="filesPath">将要压缩的⽂件夹或⽂件的绝对路径</param>
/// <param name="rarPathName">压缩后的压缩⽂件保存绝对路径(包括⽂件名称)</param>
/// <param name="IsCover">所压缩⽂件是否会覆盖已有的压缩⽂件(如果不覆盖,所压缩⽂件和已存在的相同名称的压缩⽂件不会共同存在,只保留原已存在压缩⽂件)</param> /// <param name="Pass
Word">压缩密码(如果不需要密码则为空)</param>
/// <returns>true(压缩成功);false(压缩失败)</returns>
public static bool CondenseRarOrZip( string filesPath, string rarPathName, bool IsCover, string PassWord)
{
string rarPath = Path.GetDirectoryName(rarPathName);
if (!Directory.Exists(rarPath))
Directory.CreateDirectory(rarPath);
Process Process1 = new Process();
Process1.StartInfo.FileName = "" ;
Process1.StartInfo.CreateNoWindow = true ;
string cmd = "" ;
if (! string .IsNullOrEmpty(PassWord) && IsCover)
//压缩加密⽂件且覆盖已存在压缩⽂件( -p密码 -o+覆盖 )
cmd = string .Format( " a -ep1 -p{0} -o+ {1} {2} -r" , PassWord, rarPathName, filesPath);
else if (! string .IsNullOrEmpty(PassWord) && !IsCover)
//压缩加密⽂件且不覆盖已存在压缩⽂件( -p密码 -o-不覆盖 )
cmd = string .Format( " a -ep1 -p{0} -o- {1} {2} -r" , PassWord, rarPathName, filesPath);
else if ( 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(); //⽆限期等待进程 退出
//Process1.ExitCode==0指正常执⾏,Process1.ExitCode==1则指不正常执⾏
if (Process1.ExitCode == 0)
{
Process1.Close();
return true ;
}
else
{
Process1.Close();
return false ;
}
}
到此这篇关于C#压缩或解压rar、zip⽂件的⽂章就介绍到这了,更多相关C#压缩解压rar、zip内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论