C#壓縮或解壓rar、zip文件方法實(shí)例
前言
為了便于文件在網(wǎng)絡(luò)中的傳輸和保存,通常將文件進(jìn)行壓縮操作,常用的壓縮格式有rar、zip和7z,本文將介紹在C#中如何對(duì)這幾種類型的文件進(jìn)行壓縮和解壓,并提供一些在C#中解壓縮文件的開源庫(kù)。
在C#.NET中壓縮解壓rar文件
rar格式是一種具有專利文件的壓縮格式,是一種商業(yè)壓縮格式,不開源,對(duì)解碼算法是公開的,但壓縮算法是私有的,需要付費(fèi),如果需要在您的商業(yè)軟件中使用rar格式進(jìn)行解壓縮,那么你需要為rar付費(fèi),rar在國(guó)內(nèi)很流行是由于盜版的存在,正因?yàn)樗惴ㄊ遣婚_源的,所以我們壓縮rar并沒有第三方的開源庫(kù)可供選擇,只能另尋出路。
針對(duì)rar的解壓縮,我們通常使用winrar,幾乎每臺(tái)機(jī)器都安裝了winrar,對(duì)于普通用戶來(lái)說(shuō)它提供基于用戶界面的解壓縮方式,另外,它也提供基于命令行的解壓縮方式,這為我們?cè)诔绦蛑薪鈮嚎srar格式提供了一個(gè)入口,我們可以在C#程序中調(diào)用rar的命令行程序?qū)崿F(xiàn)解壓縮,思路是這樣的:
1、判斷注冊(cè)表確認(rèn)用戶機(jī)器是否安裝winrar程序,如果安裝取回winrar安裝目錄。
2、創(chuàng)建一個(gè)命令行執(zhí)行進(jìn)程。
3、通過(guò)winrar的命令行參數(shù)實(shí)現(xiàn)解壓縮。
首先我們通過(guò)下面的代碼判斷用戶計(jì)算機(jī)是否安裝了winrar壓縮工具:
如果已經(jīng)安裝winrar可通過(guò)如下代碼返回winrar的安裝位置,未安裝則返回空字符串,最后并關(guān)閉注冊(cè)表:
public static string ExistsWinRar() { string result = string.Empty; string key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe"; 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 Paths\WinRAR.exe"; 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, "rar.exe"); 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 Paths\WinRAR.exe"; 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, "rar.exe"); processStartInfo.Arguments = commandOptions; processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; Process process = new Process(); process.StartInfo = processStartInfo; process.Start(); process.WaitForExit(); process.Close(); }
在C#.NET中壓縮解壓zip文件
zip是一種免費(fèi)開源的壓縮格式,windows平臺(tái)自帶zip壓縮和解壓工具,由于算法是開源的,所以基于zip的解壓縮開源庫(kù)也很多,SharpZipLib是一個(gè)很不錯(cuò)的C#庫(kù),它能夠解壓縮zip、gzip和tar格式的文件,首先下載SharpZipLib解壓后,在您的項(xiàng)目中引用ICSharpCode.SharpZLib.dll程序集即可,下面是一些關(guān)于SharpZipLib壓縮和解壓的示例。
ZipOutputStream zipOutStream = new ZipOutputStream(File.Create("my.zip")); CreateFileZipEntry(zipOutStream, "file1.txt", "file1.txt"); CreateFileZipEntry(zipOutStream, @"folder1\folder2\folder3\file2.txt", "file2.txt"); 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命名空間有一些關(guān)于文件解壓縮的類,如果只是希望壓縮解壓zip和gzip格式的文件,是個(gè)不錯(cuò)的選擇,在NET Framework 4.5框架中,原生System.IO.Compression.FileSystem.dll程序集中新增了一個(gè)名為ZipFile的類,,讓壓縮和解壓zip文件變得更簡(jiǎn)單,ZipFile的使用示例如下:
System.IO.Compression.ZipFile.CreateFromDirectory(@"e:\test", @"e:\test\test.zip"); //壓縮
System.IO.Compression.ZipFile.ExtractToDirectory(@"e:\test\test.zip", @"e:\test"); //解壓
支持格式最多的C#解壓縮開源庫(kù)
當(dāng)您還苦苦在為上面的各種壓縮格式發(fā)愁的時(shí)候,一個(gè)名為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"); } } }
總結(jié)
關(guān)于rar和zip格式相比,rar的壓縮率比zip要高,而且支持分卷壓縮,但rar是商業(yè)軟件,需要付費(fèi),zip壓縮率不如rar那么高,但開源免費(fèi),7zip格式開源免費(fèi),壓縮率較為滿意,這些壓縮格式各有優(yōu)勢(shì),就微軟平臺(tái)和一些開源平臺(tái)來(lái)說(shuō),一般采用的都是zip格式,因?yàn)樗菀淄ㄟ^(guò)編程的方式實(shí)現(xiàn),比rar更加可靠。
/// <summary> /// 解壓RAR和ZIP文件(需存在Winrar.exe(只要自己電腦上可以解壓或壓縮文件就存在Winrar.exe)) /// </summary> /// <param name="UnPath">解壓后文件保存目錄</param> /// <param name="rarPathName">待解壓文件存放絕對(duì)路徑(包括文件名稱)</param> /// <param name="IsCover">所解壓的文件是否會(huì)覆蓋已存在的文件(如果不覆蓋,所解壓出的文件和已存在的相同名稱文件不會(huì)共同存在,只保留原已存在文件)</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 = "Winrar.exe" ; 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(); //無(wú)限期等待進(jìn)程 winrar.exe 退出 //Process1.ExitCode==0指正常執(zhí)行,Process1.ExitCode==1則指不正常執(zhí)行 if (Process1.ExitCode == 0) { Process1.Close(); return true ; } else { Process1.Close(); return false ; } } /// <summary> /// 壓縮文件成RAR或ZIP文件(需存在Winrar.exe(只要自己電腦上可以解壓或壓縮文件就存在Winrar.exe)) /// </summary> /// <param name="filesPath">將要壓縮的文件夾或文件的絕對(duì)路徑</param> /// <param name="rarPathName">壓縮后的壓縮文件保存絕對(duì)路徑(包括文件名稱)</param> /// <param name="IsCover">所壓縮文件是否會(huì)覆蓋已有的壓縮文件(如果不覆蓋,所壓縮文件和已存在的相同名稱的壓縮文件不會(huì)共同存在,只保留原已存在壓縮文件)</param> /// <param name="PassWord">壓縮密碼(如果不需要密碼則為空)</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 = "Winrar.exe" ; 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(); //無(wú)限期等待進(jìn)程 winrar.exe 退出 //Process1.ExitCode==0指正常執(zhí)行,Process1.ExitCode==1則指不正常執(zhí)行 if (Process1.ExitCode == 0) { Process1.Close(); return true ; } else { Process1.Close(); return false ; } }
到此這篇關(guān)于C#壓縮或解壓rar、zip文件的文章就介紹到這了,更多相關(guān)C#壓縮解壓rar、zip內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析C#中StringBuilder類的高效及與String的對(duì)比
StringBuilder類所創(chuàng)造出來(lái)的字符串對(duì)象在拼接操作等方面比普通的string類往往要高效很多,這是它們?cè)趦?nèi)存劃分方式上的不同所決定的,下面就來(lái)淺析C#中StringBuilder類的高效及與String的對(duì)比2016-05-05在C#中使用二叉樹實(shí)時(shí)計(jì)算海量用戶積分排名的實(shí)現(xiàn)詳解
這篇文章主要介紹了在C#中使用二叉樹實(shí)時(shí)計(jì)算海量用戶積分排名的實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01C#服務(wù)器NFS共享文件夾搭建與上傳圖片文件的實(shí)現(xiàn)
本文主要介紹了C#服務(wù)器NFS共享文件夾搭建與上傳圖片文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C#實(shí)現(xiàn)簡(jiǎn)單獲取及設(shè)置Session類
這篇文章主要介紹了C#實(shí)現(xiàn)簡(jiǎn)單獲取及設(shè)置Session類,涉及C#針對(duì)session的設(shè)置及獲取的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03C# MVC模式中應(yīng)該怎樣區(qū)分應(yīng)用程序邏輯(Controller層)和業(yè)務(wù)邏輯(Model層)?
這篇文章主要介紹了C# MVC模式中應(yīng)該怎樣區(qū)分應(yīng)用程序邏輯(Controller層)和業(yè)務(wù)邏輯(Model層)?,這也小編做.NET項(xiàng)目時(shí)經(jīng)常思考和讓人混亂的一個(gè)問(wèn)題,這篇文章寫的挺好,一下清晰了許多,需要的朋友可以參考下2015-06-06