詳解C#壓縮、解壓文件夾/文件(帶密碼)
前言
今天梳理一下項(xiàng)目中用到的壓縮、解壓文件夾或文件的方法,發(fā)現(xiàn)因?yàn)樾枨蟛煌呀?jīng)用了好幾個(gè)不同組件。今天就好好整理記錄下,別下次遇到需求又重頭開(kāi)始了。
DotNetZip
DotNetZip是一個(gè)開(kāi)源的免費(fèi)類庫(kù),主要提供了快速操作zip文件的工具集,VB、C#任何.Net語(yǔ)言都可以通過(guò)它創(chuàng)建、解壓縮zip文件。我使用該類庫(kù)最主要的目的還是因?yàn)樗梢詣?chuàng)建帶密碼保護(hù)的壓縮文件。
只有設(shè)置了zip.Password = "password"之后,被壓縮的文件才會(huì)有密碼保護(hù)
/// <summary> /// 壓縮文件/文件夾 /// </summary> /// <param name="filePath">需要壓縮的文件/文件夾路徑</param> /// <param name="zipPath">壓縮文件路徑(zip后綴)</param> /// <param name="password">密碼</param> /// <param name="filterExtenList">需要過(guò)濾的文件后綴名</param> public static void CompressionFile(string filePath, string zipPath, string password = "", List<string> filterExtenList = null) { try { using (ZipFile zip = new ZipFile(Encoding.UTF8)) { if (!string.IsNullOrWhiteSpace(password)) { zip.Password = password; } if (Directory.Exists(filePath)) { if (filterExtenList == null) zip.AddDirectory(filePath); else AddDirectory(zip, filePath, filePath, filterExtenList); } else if (File.Exists(filePath)) { zip.AddFile(filePath,""); } zip.Save(zipPath); } } catch (Exception ex) { throw ex; } } /// <summary> /// 添加文件夾 /// </summary> /// <param name="zip">ZipFile對(duì)象</param> /// <param name="dirPath">需要壓縮的文件夾路徑</param> /// <param name="rootPath">根目錄路徑</param> /// <param name="filterExtenList">需要過(guò)濾的文件后綴名</param> public static void AddDirectory(ZipFile zip, string dirPath, string rootPath, List<string> filterExtenList) { var files = Directory.GetFiles(dirPath); for (int i = 0; i < files.Length; i++) { //如果Contains不支持第二個(gè)參數(shù),就用.ToLower() if (filterExtenList == null || (filterExtenList != null && !filterExtenList.Any(d => Path.GetExtension(files[i]).Contains(d, StringComparison.OrdinalIgnoreCase)))) { //獲取相對(duì)路徑作為zip文件中目錄路徑 zip.AddFile(files[i], Path.GetRelativePath(rootPath, dirPath)); //如果沒(méi)有Path.GetRelativePath方法,可以用下面代碼替換 //string relativePath = Path.GetFullPath(dirPath).Replace(Path.GetFullPath(rootPath), ""); //zip.AddFile(files[i], relativePath); } } var dirs = Directory.GetDirectories(dirPath); for (int i = 0; i < dirs.Length; i++) { AddDirectory(zip, dirs[i], rootPath, filterExtenList); } }
SharpCompress
SharpCompress是用到現(xiàn)在,感覺(jué)功能最強(qiáng)大的壓縮、解壓開(kāi)源插件。它支持處理zip、rar、7z等多種格式的壓縮文件,使用方式也很簡(jiǎn)單。當(dāng)然,最讓我難受的是創(chuàng)建壓縮文件的時(shí)候沒(méi)法設(shè)置密碼~所以才有了上面DotnetZip的代碼。
SharpCompress版本不同,設(shè)置ArchiveEncoding的方式也不同,默認(rèn)設(shè)置了UTF8防止解壓亂碼。
通過(guò)設(shè)置ArchiveType切換生成不同格式壓縮文件
/// <summary> /// 壓縮文件/文件夾 /// </summary> /// <param name="filePath">需要壓縮的文件/文件夾路徑</param> /// <param name="zipPath">壓縮文件路徑(zip后綴)</param> /// <param name="filterExtenList">需要過(guò)濾的文件后綴名</param> public static void CompressionFile(string filePath, string zipPath, List<string> filterExtenList = null) { try { using (var zip = File.Create(zipPath)) { var option = new WriterOptions(CompressionType.Deflate) { ArchiveEncoding = new SharpCompress.Common.ArchiveEncoding() { Default = Encoding.UTF8 } }; using (var zipWriter = WriterFactory.Open(zip, ArchiveType.Zip, option)) { if (Directory.Exists(filePath)) { //添加文件夾 zipWriter.WriteAll(filePath, "*", (path) => filterExtenList == null ? true : !filterExtenList.Any(d => Path.GetExtension(path).Contains(d, StringComparison.OrdinalIgnoreCase)), SearchOption.AllDirectories); } else if (File.Exists(filePath)) { zipWriter.Write(Path.GetFileName(filePath), filePath); } } } } catch (Exception ex) { throw ex; } }
/// <summary> /// 解壓文件 /// </summary> /// <param name="zipPath">壓縮文件路徑</param> /// <param name="dirPath">解壓到文件夾路徑</param> /// <param name="password">密碼</param> public static void DeCompressionFile(string zipPath, string dirPath, string password = "") { if (!File.Exists(zipPath)) { throw new ArgumentNullException("zipPath壓縮文件不存在"); } Directory.CreateDirectory(dirPath); try { using (Stream stream = File.OpenRead(zipPath)) { var option = new ReaderOptions() { ArchiveEncoding = new SharpCompress.Common.ArchiveEncoding() { Default = Encoding.UTF8 } }; if (!string.IsNullOrWhiteSpace(password)) { option.Password = password; } var reader = ReaderFactory.Open(stream, option); while (reader.MoveToNextEntry()) { if (reader.Entry.IsDirectory) { Directory.CreateDirectory(Path.Combine(dirPath, reader.Entry.Key)); } else { //創(chuàng)建父級(jí)目錄,防止Entry文件,解壓時(shí)由于目錄不存在報(bào)異常 var file = Path.Combine(dirPath, reader.Entry.Key); Directory.CreateDirectory(Path.GetDirectoryName(file)); reader.WriteEntryToFile(file); } } } } catch (Exception ex) { throw ex; } }
總結(jié)
相似的插件還有SharpZipLib(支持更多的壓縮格式)、SevenZipSharp(專注處理7z格式壓縮文件)等,它們也都有各自的優(yōu)缺點(diǎn)。但總的來(lái)說(shuō),上面的兩個(gè)組件已經(jīng)滿足日常工作中的大部分需求,遇到相同問(wèn)題的朋友可以參考下~
到此這篇關(guān)于C#壓縮、解壓文件夾/文件(帶密碼)的文章就介紹到這了,更多相關(guān)C#壓縮、解壓文件夾/文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C#壓縮或解壓rar、zip文件方法實(shí)例
- 如何在c#中使用Zlib壓縮與解壓
- C#調(diào)用7z實(shí)現(xiàn)文件的壓縮與解壓
- c# 如何實(shí)現(xiàn)圖片壓縮
- C# 進(jìn)行圖片壓縮的示例代碼(對(duì)jpg壓縮效果最好)
- c#壓縮字符串的方法
- C#使用GZipStream實(shí)現(xiàn)文件的壓縮與解壓
- C# 使用SharpZipLib生成壓縮包的實(shí)例代碼
- c# 文件壓縮zip或?qū)ip文件解壓的方法
- C#使用ICSharpCode.SharpZipLib.dll進(jìn)行文件的壓縮與解壓功能
- c# 用ICSharpCode組件壓縮文件
相關(guān)文章
在WPF中合并兩個(gè)ObservableCollection集合
這篇文章介紹了在WPF中合并兩個(gè)ObservableCollection集合的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06C#中實(shí)現(xiàn)輸入漢字獲取其拼音(漢字轉(zhuǎn)拼音)的2種方法
這篇文章主要介紹了C#中實(shí)現(xiàn)輸入漢字獲取其拼音(漢字轉(zhuǎn)拼音)的2種方法,本文分別給出了使用微軟語(yǔ)言包、手動(dòng)編碼實(shí)現(xiàn)兩種實(shí)現(xiàn)方式,需要的朋友可以參考下2015-01-01C# 參考之訪問(wèn)關(guān)鍵字:base、this
由于靜態(tài)成員函數(shù)存在于類一級(jí),并且不是對(duì)象的一部分,因此沒(méi)有 this 指針。在靜態(tài)方法中引用 this 是錯(cuò)誤的。 索引器允許類或結(jié)構(gòu)的實(shí)例按照與數(shù)組相同的方式進(jìn)行索引。索引器類似于屬性,不同之處在于它們的訪問(wèn)器采用參數(shù)。2008-03-03C#中foreach語(yǔ)句使用break暫停遍歷的方法
這篇文章主要介紹了C#中foreach語(yǔ)句使用break暫停遍歷的方法,涉及C#中break語(yǔ)句跳出foreach循環(huán)的使用技巧,非常具有實(shí)用價(jià)值,是C#初學(xué)者必須掌握的重要技巧,需要的朋友可以參考下2015-04-04unity實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03