วิธีอ่านข้อมูลจากไฟล์ zip โดยไม่ต้องคลายซิปทั้งไฟล์


99

มีอยู่แล้วใน. Net (C #) เพื่อดึงข้อมูลจากไฟล์ zip โดยไม่ต้องคลายการบีบอัดไฟล์ทั้งหมดหรือไม่?

เพียงแค่ฉันอาจต้องการแยกข้อมูล (ไฟล์) จากจุดเริ่มต้นของไฟล์ zip ซึ่งแน่นอนว่าสิ่งนี้ขึ้นอยู่กับว่าอัลกอริทึมการบีบอัดบีบอัดไฟล์ตามลำดับที่กำหนด


คำตอบ:


79

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 ดูเหมือนจะเป็น repo ของผู้เขียนต้นฉบับ
  • https://github.com/haf/DotNetZip.Semverd ดูเหมือนว่าจะเป็นเวอร์ชันที่ได้รับการดูแลในปัจจุบัน นอกจากนี้ยังบรรจุไว้ใน Nuget ที่https://www.nuget.org/packages/DotNetZip/


9
+1. เบื้องหลังสิ่งที่ DotNetZip ทำในตัวสร้างคือการค้นหา "ไดเร็กทอรี" ภายใน zipfile จากนั้นอ่านและเติมข้อมูลในรายการ ณ จุดนั้นหากแอปของคุณเรียก Extract () ในรายการเดียว DotNetZip จะค้นหาตำแหน่งที่เหมาะสมในไฟล์ zip และขยายขนาดข้อมูลสำหรับรายการนั้น ๆ
Cheeso

117

ด้วย. 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 และแตกไฟล์


37
คุณยังสามารถใช้รายการเปิด () เพื่อรับสตรีม (หากควรอ่านเนื้อหา แต่ไม่ได้เขียนลงในไฟล์)

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
พูดตามตรงว่าฉันไม่เห็นว่าลิงก์นี้ตอบคำถามอย่างไร
Eugene Mayevski 'Callback

11

นี่คือวิธีที่สามารถอ่านไฟล์ข้อความ 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 จะนำหน้ารายการ Local File Header ซึ่ง (โดยปกติ) มีข้อมูลเพียงพอสำหรับการคลายการบีบอัดโดยทั่วไปคุณสามารถแยกวิเคราะห์รายการดังกล่าวในสตรีมได้อย่างง่ายดายเลือกไฟล์ที่ต้องการคัดลอกส่วนหัว + ข้อมูลไฟล์บีบอัดไปยังไฟล์อื่น ๆ และเรียกเปิดเครื่องรูดในส่วนนั้น (หากคุณไม่ต้องการจัดการกับรหัสหรือไลบรารีการบีบอัด Zip ทั้งหมด)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.