2011-05-11 14 views
68

Czy mimo to jest .Net (C#), aby wyodrębnić dane z pliku zip bez dekompresji całego pliku?Jak odczytać dane z pliku ZIP bez konieczności rozpakowywania całego pliku

Po prostu prawdopodobnie chcę wyodrębnić dane (plik) od początku pliku zip, oczywiście zależy to od tego, czy algorytm kompresji skompresuje plik w deterministycznej kolejności.

+3

To pytanie brzmi w sposób, który jest trudny do zrozumienia, Zalecam aktualizację tytułu pytania tak, aby był bardziej zgodny z linijkami "Jak odczytać dane z pliku ZIP bez konieczności rozpakowywania całego pliku" –

+0

@ CHRZEŚCIE Zmieniłem tytuł zgodnie z Twoją sugestią, zgadzam się, że łatwiej jest szybko zrozumieć . – JYelton

+0

Dupek z http://stackoverflow.com/questions/328343/using-sharpziplib-to-unzip-specific-files? – Magnus

Odpowiedz

63

DotNetZip jest tu twoim przyjacielem.

Tak łatwe, jak:

using (ZipFile zip = ZipFile.Read(ExistingZipFile)) 
{ 
    ZipEntry e = zip["MyReport.doc"]; 
    e.Extract(OutputStream); 
} 

(można także wyodrębnić z pliku lub innych miejsc).

Czytając tabelę plik zip za treści jest tak proste, jak:

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"); 

    } 
} 
+8

+1. Za kulisami, co DotNetZip robi w konstruktorze, szukaj "katalogu" wewnątrz pliku zip, a następnie przeczytaj i zapełnij listę wpisów. W tym momencie, jeśli Twoja aplikacja wywołuje funkcję Extract() na jednym wpisie, DotNetZip szuka odpowiedniego miejsca w pliku zip i dekompresuje dane tylko dla tego wpisu. – Cheeso

14

Coś jak to będzie lista i wyodrębnić pliki jeden po drugim, jeśli chcesz używać 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()); 
    } 
} 

Na podstawie tego przykładu: content inside zip file

+1

Szczerze mówiąc, nie widziałem, jak ten link odpowiada na pytanie. –

0

Zip mieć spis treści. Każde narzędzie zip powinno mieć możliwość wysyłania zapytań tylko do spisu treści. Lub możesz użyć programu wiersza poleceń, takiego jak 7zip-t, aby wydrukować spis treści i przekierować go do pliku tekstowego.

0

W takim przypadku trzeba będzie analizować zip lokalne wpisy cel. Każdy plik, przechowywany w pliku zip, poprzedza pozycję Local File Header, która (zwykle) zawiera wystarczającą ilość informacji do dekompresji, Zwykle można wykonać proste analizowanie takich wpisów w strumieniu, wybrać potrzebny plik, skopiować nagłówek + skompresowane dane pliku do innych plików file i wywołaj unzip na tej części (jeśli nie chcesz zajmować się całym kodem dekompresyjnym lub biblioteką Zip).

78

Z .Net Framework 4.5 (przy ZipArchive):

using (ZipArchive zip = ZipFile.Open(zipfile, ZipArchiveMode.Read)) 
    foreach (ZipArchiveEntry entry in zip.Entries) 
     if(entry.Name == "myfile") 
      entry.ExtractToFile("myfile"); 

Find "myfile" w na kartę SD i wyjąć go.

+20

Można również użyć entry.Open(), aby pobrać strumień (jeśli zawartość powinna być przeczytana, ale nie zapisana do pliku). Odniesienia – anre

+7

: "System.IO.Compression.dll" i "System.IO.Compression.FileSystem.dll" – yzorg

1

Oto jak plik tekstowy UTF8 można odczytać z archiwum zip do zmiennej string (.NET Framework 4.5 i wyżej):

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()); 
Powiązane problemy