日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

使用 C# 读取 zip 压缩包解压文件的方法及注意事项

發(fā)布時(shí)間:2024/3/24 C# 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 C# 读取 zip 压缩包解压文件的方法及注意事项 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

從 .NET Framework 4.5 版本開(kāi)始,微軟為 .NET 類(lèi)庫(kù)增加了一個(gè)名為 ZipFile 的類(lèi)型。該類(lèi)型在?System.IO.Compression?命名空間下,提供創(chuàng)建、解壓縮和打開(kāi) zip 存檔的靜態(tài)方法。若要在 .NET Framework 應(yīng)用中使用 ZipFile 類(lèi),必須添加對(duì)程序集 System.IO.Compression.FileSystem 的引用。

參考鏈接:

https://docs.microsoft.com/zh-cn/dotnet/api/system.io.compression.zipfile?view=net-6.0

使用以下代碼讀取壓縮文件內(nèi)容:

var fn = @"test.zip"; using (var zip = ZipFile.OpenRead(fn)) {foreach (var entry in zip.Entries){Console.WriteLine("文件名:{0}", entry.FullName);using (var stream = entry.Open())using (var reader = new StreamReader(stream)){var str = reader.ReadToEnd();Console.WriteLine(str);}} }

但是,有時(shí)候上述代碼會(huì)不好用。當(dāng)遇到一個(gè)較大的 zip 文件時(shí)可能會(huì)報(bào)錯(cuò):

Number of entries expected in End Of Central Directory does not correspond to number of entries in Central Directory.

關(guān)于該錯(cuò)誤,只能搜索到零星的答案,而且大部分都是從國(guó)外網(wǎng)站機(jī)翻的沒(méi)有任何參考價(jià)值。

SharpZipLib?

在 NuGet 上以 zip 為關(guān)鍵詞搜索時(shí),排名第二的是一個(gè)名為 SharpZipLib 的軟件包。

SharpZipLib :https://www.nuget.org/packages/SharpZipLib/

示例代碼:

var fn = @"test.zip"; using (var zip = new ZipFile(fn)) {foreach (ZipEntry entry in zip){Console.WriteLine("文件名:{0}", entry.Name);using (var stream = zip.GetInputStream(entry))using (var reader = new StreamReader(stream)){var str = reader.ReadToEnd();Console.WriteLine(str);break;}} }

在遇到同樣的 zip 包時(shí),上述代碼沒(méi)有報(bào)錯(cuò),但結(jié)果仍是錯(cuò)誤的:ZipFile 類(lèi)型有一個(gè)名為 Count 的屬性,用于獲取該 zip 包中的文件數(shù)量。使用一個(gè)包含 95 萬(wàn)個(gè)小文件的壓縮包進(jìn)行測(cè)試時(shí),該屬性的取值卻只有 39866 ,也只能獲取到 39866 個(gè)文件。這說(shuō)明該組件更坑,雖然沒(méi)報(bào)錯(cuò)但給了錯(cuò)誤的數(shù)據(jù):

含有 95 萬(wàn)個(gè)文件的 zip 壓縮包

DotNetZip

排名第三的軟件包是:DotNetZip ,也是一個(gè)比較流行的類(lèi)庫(kù)。

DotNetZip :?https://www.nuget.org/packages/DotNetZip/

他的用法和微軟自帶類(lèi)庫(kù)的用法相似:

var fn = @"test.zip"; using (var zip = ZipFile.Read(fn)) {foreach (var entry in zip.Entries){Console.WriteLine("文件名:{0}", entry.FileName);using (var stream = entry.OpenReader())using (var reader = new StreamReader(stream)){var str = reader.ReadToEnd();Console.WriteLine(str);}} }

經(jīng)測(cè)試,該類(lèi)庫(kù)在處理上文提到的文件時(shí)沒(méi)有報(bào)錯(cuò),且獲得了正確的文件內(nèi)容。唯一的遺憾是 Read 方法打開(kāi)文件時(shí)耗時(shí)較長(zhǎng)。

總結(jié)

在處理 zip 文件時(shí),微軟自帶的類(lèi)庫(kù)能滿(mǎn)足大多數(shù)需求。如果遇到報(bào)錯(cuò)的情況,在確認(rèn)源文件正常的情況下可以更換其他類(lèi)庫(kù)讀取。即使在成功讀取后,也需要核對(duì)讀取結(jié)果的正確性:沒(méi)有報(bào)錯(cuò),也不代表讀取到的數(shù)據(jù)就是正確的。

附錄

測(cè)試文件下載地址:

ftp://opendata:kagar1n@ftp.euipo.europa.eu/Applicant/Full/APPLICANTS_20201109_0001.zip

總結(jié)

以上是生活随笔為你收集整理的使用 C# 读取 zip 压缩包解压文件的方法及注意事项的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。