มีอยู่แล้วใน. Net (C #) เพื่อดึงข้อมูลจากไฟล์ zip โดยไม่ต้องคลายการบีบอัดไฟล์ทั้งหมดหรือไม่?
เพียงแค่ฉันอาจต้องการแยกข้อมูล (ไฟล์) จากจุดเริ่มต้นของไฟล์ zip ซึ่งแน่นอนว่าสิ่งนี้ขึ้นอยู่กับว่าอัลกอริทึมการบีบอัดบีบอัดไฟล์ตามลำดับที่กำหนด
มีอยู่แล้วใน. Net (C #) เพื่อดึงข้อมูลจากไฟล์ zip โดยไม่ต้องคลายการบีบอัดไฟล์ทั้งหมดหรือไม่?
เพียงแค่ฉันอาจต้องการแยกข้อมูล (ไฟล์) จากจุดเริ่มต้นของไฟล์ zip ซึ่งแน่นอนว่าสิ่งนี้ขึ้นอยู่กับว่าอัลกอริทึมการบีบอัดบีบอัดไฟล์ตามลำดับที่กำหนด
คำตอบ:
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 แล้ว:
ด้วย. 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 และแตกไฟล์
System.IO.Compression.dll
และSystem.IO.Compression.FileSystem.dll
สิ่งนี้จะแสดงรายการและแตกไฟล์ทีละไฟล์หากคุณต้องการใช้ 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 จะนำหน้ารายการ Local File Header ซึ่ง (โดยปกติ) มีข้อมูลเพียงพอสำหรับการคลายการบีบอัดโดยทั่วไปคุณสามารถแยกวิเคราะห์รายการดังกล่าวในสตรีมได้อย่างง่ายดายเลือกไฟล์ที่ต้องการคัดลอกส่วนหัว + ข้อมูลไฟล์บีบอัดไปยังไฟล์อื่น ๆ และเรียกเปิดเครื่องรูดในส่วนนั้น (หากคุณไม่ต้องการจัดการกับรหัสหรือไลบรารีการบีบอัด Zip ทั้งหมด)