Як читати дані із zip-файлу, не розпаковуючи весь файл


97

Чи є в будь-якому випадку .Net (C #) витяг даних із zip-файлу без декомпресії повного файлу?

Просто я, можливо, хочу отримати дані (файл) з початку zip-файлу, очевидно, це залежить від того, чи алгоритм стиснення стискає файл у детермінованому порядку.


Відповіді:


78

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:



9
+1. За лаштунками те, що DotNetZip робить у конструкторі, - шукати "каталог" усередині zip-файлу, а потім прочитати його та заповнити список записів. У цей момент, якщо ваш додаток викликає Extract () в одному записі, DotNetZip шукає потрібне місце у файлі zip та розпаковує дані лише для цього запису.
Cheeso

115

У .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 та витягніть його.


35
Можна також використовувати entry.Open (), щоб просто отримати потік (якщо вміст слід читати, але не записувати у файл).
anre

17
посилання: System.IO.Compression.dllтаSystem.IO.Compression.FileSystem.dll
yzorg

18

Щось подібне буде перераховувати та витягувати файли по одному, якщо ви хочете використовувати 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-файлу


1
Чесно кажучи, я не міг зрозуміти, як це посилання відповідає на питання.
Євген Маєвський 'Зворотній дзвінок

10

Ось як текстовий файл 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());

0

Zip-файли мають зміст. Кожна zip-програма повинна мати можливість запитувати лише TOC. Або ви можете використовувати програму командного рядка, як 7zip -t, щоб надрукувати зміст і перенаправити його в текстовий файл.


0

У такому випадку вам потрібно буде проаналізувати zip-записи локальних заголовків. Кожен файл, що зберігається в zip-файлі, має попередній запис у локальному файловому заголовку, який (як правило) містить достатню кількість інформації для декомпресії. Як правило, ви можете зробити простий аналіз таких записів у потоці, вибрати необхідний файл, скопіювати заголовок + стислі дані файлу до інших файл і викличте розпакуйте цю частину (якщо ви не хочете мати справу з цілим кодом декомпресії Zip або бібліотекою).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.