Как читать данные из zip-файлов без необходимости распаковывать весь файл
есть ли в .Net (C#) для извлечения данных из zip-файла без распаковки полного файла?
просто я, возможно, хочу извлечь данные (файл) из начала zip-файла, очевидно, это зависит от того, сжимает ли алгоритм сжатия файл в детерминированном порядке.
6 ответов:
DotNetZip это ваш друг здесь.
так же просто, как:
using (ZipFile zip = ZipFile.Read(ExistingZipFile)) { ZipEntry e = zip["MyReport.doc"]; e.Extract(OutputStream); }(вы также можете извлечь в файл или другие места назначения).
чтение оглавления zip-файла так же просто, как:
using (ZipFile zip = ZipFile.Read(ExistingZipFile)) { foreach (ZipEntry e in zip) { if (header) { System.Console.WriteLine("Zipfile: {0}", zip.Name); if ((zip.Comment != null) && (zip.Comment != "")) System.Console.WriteLine("Comment: {0}", zip.Comment); System.Console.WriteLine("\n{1,-22} {2,8} {3,5} {4,8} {5,3} {0}", "Filename", "Modified", "Size", "Ratio", "Packed", "pw?"); System.Console.WriteLine(new System.String('-', 72)); header = false; } System.Console.WriteLine("{1,-22} {2,8} {3,5:F0}% {4,8} {5,3} {0}", e.FileName, e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"), e.UncompressedSize, e.CompressionRatio, e.CompressedSize, (e.UsesEncryption) ? "Y" : "N"); } }
Отредактировано, Чтобы Отметить: DotNetZip привыкли жить на веб-сайте CodePlex. Codeplex был закрыт. Старый архив все еще доступно в Codeplex. Похоже, что код был перенесен в Github:
- https://github.com/DinoChiesa/DotNetZip. похоже на оригинальное авторское РЕПО.
- https://github.com/haf/DotNetZip.Semverd. это похоже на текущую версию. Он также упакован в доступный через Nuget по адресу https://www.nuget.org/packages/DotNetZip/
С .Net Framework 4.5 (используя ZipArchive):
using (ZipArchive zip = ZipFile.Open(zipfile, ZipArchiveMode.Read)) foreach (ZipArchiveEntry entry in zip.Entries) if(entry.Name == "myfile") entry.ExtractToFile("myfile");найти "myfile" в zipfile и извлечь его.
что-то вроде этого будет перечислять и извлекать файлы один за другим, если вы хотите использовать SharpZipLib:
var zip = new ZipInputStream(File.OpenRead(@"C:\Users\Javi\Desktop\myzip.zip")); var filestream = new FileStream(@"C:\Users\Javi\Desktop\myzip.zip", FileMode.Open, FileAccess.Read); ZipFile zipfile = new ZipFile(filestream); ZipEntry item; while ((item = zip.GetNextEntry()) != null) { Console.WriteLine(item.Name); using (StreamReader s = new StreamReader(zipfile.GetInputStream(item))) { // stream with the file Console.WriteLine(s.ReadToEnd()); } }на основе этого примера:содержимое внутри zip-файл
вот как текстовый файл UTF8 можно прочитать из zip-архива в строковую переменную (.NET Framework 4.5 и выше):
string zipFileFullPath = "{{TypeYourZipFileFullPathHere}}"; string targetFileName = "{{TypeYourTargetFileNameHere}}"; string text = new string( (new System.IO.StreamReader( System.IO.Compression.ZipFile.OpenRead(zipFileFullPath) .Entries.Where(x => x.Name.Equals(targetFileName, StringComparison.InvariantCulture)) .FirstOrDefault() .Open(), Encoding.UTF8) .ReadToEnd()) .ToArray());
Zip-файлы имеют оглавление. Каждая утилита zip должна иметь возможность запрашивать только TOC. Или вы можете использовать программу командной строки, такую как 7zip-t, чтобы распечатать оглавление и перенаправить его в текстовый файл.
в таком случае вам нужно будет разобрать локальные записи заголовка zip. Каждый файл, хранящийся в zip-файле, имеет предшествующую локальную запись заголовка файла, которая (обычно) содержит достаточно информации для распаковки, как правило, вы можете сделать простой разбор таких записей в потоке, выбрать необходимый файл, скопировать заголовок + сжатые данные файла в другой файл и вызвать распаковку на этой части (если вы не хотите иметь дело со всем кодом распаковки Zip или библиотекой).
Comments