最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#壓縮或解壓rar、zip文件方法實例

 更新時間:2021年05月10日 11:11:11   作者:一葉青晨  
這篇文章主要給大家介紹了關于C#壓縮或解壓rar、zip文件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

為了便于文件在網(wǎng)絡中的傳輸和保存,通常將文件進行壓縮操作,常用的壓縮格式有rar、zip和7z,本文將介紹在C#中如何對這幾種類型的文件進行壓縮和解壓,并提供一些在C#中解壓縮文件的開源庫。

在C#.NET中壓縮解壓rar文件

rar格式是一種具有專利文件的壓縮格式,是一種商業(yè)壓縮格式,不開源,對解碼算法是公開的,但壓縮算法是私有的,需要付費,如果需要在您的商業(yè)軟件中使用rar格式進行解壓縮,那么你需要為rar付費,rar在國內(nèi)很流行是由于盜版的存在,正因為算法是不開源的,所以我們壓縮rar并沒有第三方的開源庫可供選擇,只能另尋出路。

針對rar的解壓縮,我們通常使用winrar,幾乎每臺機器都安裝了winrar,對于普通用戶來說它提供基于用戶界面的解壓縮方式,另外,它也提供基于命令行的解壓縮方式,這為我們在程序中解壓縮rar格式提供了一個入口,我們可以在C#程序中調(diào)用rar的命令行程序?qū)崿F(xiàn)解壓縮,思路是這樣的:

1、判斷注冊表確認用戶機器是否安裝winrar程序,如果安裝取回winrar安裝目錄。

2、創(chuàng)建一個命令行執(zhí)行進程。

3、通過winrar的命令行參數(shù)實現(xiàn)解壓縮。

首先我們通過下面的代碼判斷用戶計算機是否安裝了winrar壓縮工具:

如果已經(jīng)安裝winrar可通過如下代碼返回winrar的安裝位置,未安裝則返回空字符串,最后并關閉注冊表:

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是一種免費開源的壓縮格式,windows平臺自帶zip壓縮和解壓工具,由于算法是開源的,所以基于zip的解壓縮開源庫也很多,SharpZipLib是一個很不錯的C#庫,它能夠解壓縮zip、gzip和tar格式的文件,首先下載SharpZipLib解壓后,在您的項目中引用ICSharpCode.SharpZLib.dll程序集即可,下面是一些關于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命名空間有一些關于文件解壓縮的類,如果只是希望壓縮解壓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#解壓縮開源庫

當您還苦苦在為上面的各種壓縮格式發(fā)愁的時候,一個名為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是商業(yè)軟件,需要付費,zip壓縮率不如rar那么高,但開源免費,7zip格式開源免費,壓縮率較為滿意,這些壓縮格式各有優(yōu)勢,就微軟平臺和一些開源平臺來說,一般采用的都是zip格式,因為它更容易通過編程的方式實現(xiàn),比rar更加可靠。

/// <summary>
/// 解壓RAR和ZIP文件(需存在Winrar.exe(只要自己電腦上可以解壓或壓縮文件就存在Winrar.exe))
/// </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 = "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(); //無限期等待進程 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">將要壓縮的文件夾或文件的絕對路徑</param>
/// <param name="rarPathName">壓縮后的壓縮文件保存絕對路徑(包括文件名稱)</param>
/// <param name="IsCover">所壓縮文件是否會覆蓋已有的壓縮文件(如果不覆蓋,所壓縮文件和已存在的相同名稱的壓縮文件不會共同存在,只保留原已存在壓縮文件)</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(); //無限期等待進程 winrar.exe 退出
     //Process1.ExitCode==0指正常執(zhí)行,Process1.ExitCode==1則指不正常執(zhí)行
     if (Process1.ExitCode == 0)
     {
         Process1.Close();
         return true ;
     }
     else
     {
         Process1.Close();
         return false ;
     }
 
}

到此這篇關于C#壓縮或解壓rar、zip文件的文章就介紹到這了,更多相關C#壓縮解壓rar、zip內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#調(diào)用C++dll方法步驟

    C#調(diào)用C++dll方法步驟

    在本篇文章中小編給讀者們整理了關于C#調(diào)用C++dll方法和步驟,需要的朋友們跟著操作下。
    2019-02-02
  • Repeater控件綁定的三種方式

    Repeater控件綁定的三種方式

    Repeater 控件用于顯示重復的信息,這些信息被綁定在該控件上。一般項目中經(jīng)常出現(xiàn)三種使用方式
    2013-05-05
  • C# 操作 access 數(shù)據(jù)庫的實例代碼

    C# 操作 access 數(shù)據(jù)庫的實例代碼

    這篇文章主要介紹了C# 操作 access 數(shù)據(jù)庫的實例代碼,需要的朋友可以參考下
    2018-03-03
  • C# PadLeft、PadRight用法詳解

    C# PadLeft、PadRight用法詳解

    本文主要介紹了C# PadLeft、PadRight用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • C#中Monitor對象與Lock關鍵字的區(qū)別分析

    C#中Monitor對象與Lock關鍵字的區(qū)別分析

    這篇文章主要介紹了C#中Monitor對象與Lock關鍵字的區(qū)別,需要的朋友可以參考下
    2013-06-06
  • c#二叉樹存儲介紹

    c#二叉樹存儲介紹

    大家好,本篇文章主要講的是c#二叉樹存儲介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Unity實現(xiàn)透視滑動列表

    Unity實現(xiàn)透視滑動列表

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)透視滑動列表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • c#入門之類型轉(zhuǎn)換詳解

    c#入門之類型轉(zhuǎn)換詳解

    這篇文章主要介紹了c#的類型轉(zhuǎn)換詳解,類型轉(zhuǎn)換分兩種形式:隱式轉(zhuǎn)換、顯示轉(zhuǎn)換,下面是詳細介紹
    2014-04-04
  • C# 調(diào)用WebApi的實現(xiàn)

    C# 調(diào)用WebApi的實現(xiàn)

    這篇文章主要介紹了C# 調(diào)用WebApi的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • C# 基于udp廣播收集局域網(wǎng)類所有設備信息

    C# 基于udp廣播收集局域網(wǎng)類所有設備信息

    這篇文章主要介紹了C# 基于udp廣播收集局域網(wǎng)類所有設備信息的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12

最新評論

阜南县| 杭锦旗| 蒙阴县| 峡江县| 会同县| 郸城县| 土默特右旗| 绵阳市| 鸡东县| 繁峙县| 聂拉木县| 河南省| 日土县| 辽阳市| 邯郸市| 原阳县| 盈江县| 麻江县| 礼泉县| 长寿区| 定西市| 江油市| 广州市| 闵行区| 密云县| 周宁县| 息烽县| 潢川县| 深州市| 昌都县| 无为县| 抚远县| 呈贡县| 安丘市| 兰州市| 鹤庆县| 南乐县| 柯坪县| 象山县| 平顶山市| 海林市|