ZIP คืออะไร (รูปแบบไฟล์)
ZIP เป็นรูปแบบไฟล์อาร์ไคฟ์ที่รองรับการบีบอัดข้อมูลแบบไม่มีการสูญเสีย (lossless). ไฟล์ ZIP อาจประกอบด้วยไฟล์หรือไดเรกทอรีหนึ่งหรือหลายรายการที่ถูกบีบอัดแล้ว. ไฟล์ ZIP มักใช้ส่วนขยาย .zip หรือ .ZIP และ MIME type คือ application/zip. ZIP ถูกใช้เป็นรูปแบบไฟล์พื้นฐานโดยหลายโปรแกรม, บางครั้งภายใต้ชื่ออื่น. เมื่อเรียกดูระบบไฟล์ผ่านอินเทอร์เฟซผู้ใช้ ไอคอนกราฟิกที่แสดงไฟล์ ZIP มักปรากฏเป็นเอกสารหรือวัตถุอื่นที่มีรูปซิป prominently.
มี หลายวิธีในการบีบอัดไฟล์
ขึ้นอยู่กับระบบปฏิบัติการที่คุณใช้. และเกือบทุกวัน เราต้องบีบอัดหรือแตกไฟล์บางไฟล์และส่งต่อไปยังเซิร์ฟเวอร์จัดเก็บหรือแพลตฟอร์มแชร์ไฟล์. โชคดีที่เราสามารถทำกระบวนการนี้อัตโนมัติด้วย Aspose.ZIP API
. มันช่วยให้คุณบีบอัดและแตกไฟล์ได้โดยไม่ต้องกังวลเกี่ยวกับโครงสร้างไฟล์พื้นฐาน. บทความนี้แสดงการทำงานกับการบีบอัดไฟล์เดี่ยวและหลายไฟล์.
Aspose.ZIP package สามารถเพิ่มลงในโครงการ .NET ของคุณได้ด้วยคำสั่ง NuGet ต่อไปนี้:
PM> Install-Package Aspose.Zip
วิธีบีบอัดไฟล์เดียวด้วย C#
- ก่อนแรกเราต้องสร้างอ็อบเจ็กต์ของคลาส FileStream class
สำหรับไฟล์ ZIP ผลลัพธ์
- โหลดไฟล์เดียวเข้าสู่วัตถุ FileStream
- สร้างอ็อบเจ็กต์ของคลาส Archive class
- เพิ่มไฟล์ลงในอาร์ไคฟ์โดยใช้เมธอด Archive.CreateEntry
( “FileName”, FileStream)
- สร้างไฟล์ ZIP โดยใช้เมธอด Archive.Save
(FileStream)
using (FileStream zipFile = File.Open(dataDir + "CompressSingleFile_out.zip", FileMode.Create))
{
//File to be added to archive
using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
{
using (var archive = new Archive(new ArchiveEntrySettings()))
{
archive.CreateEntry("alice29.txt", source1);
archive.Save(zipFile);
}
}
}
การบีบอัดหลายไฟล์ด้วย C#
ความแตกต่างระหว่างการบีบอัดไฟล์เดียวและหลายไฟล์คือเราต้องโหลดไฟล์เพิ่มขึ้นใน FileStream และเพิ่มทั้งหมดลงในอาร์ไคฟ์โดยใช้เมธอด Archive.CreateEntry("FileName", FileStream). ตัวอย่างโค้ดต่อไปนี้แสดงวิธีเพิ่มหลายไฟล์ลงใน ZIP ด้วย FileStream.
// Create FileStream for output ZIP archive
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
// File to be added to archive
using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
{
// File to be added to archive
using (FileStream source2 = File.Open("asyoulike.txt", FileMode.Open, FileAccess.Read))
{
using (var archive = new Archive())
{
// Add files to the archive
archive.CreateEntry("alice29.txt", source1);
archive.CreateEntry("asyoulik3.txt", source2);
// ZIP the files
archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "two files are compressed in this archive" });
}
}
}
}
บีบอัดไฟล์โดยใช้คลาส FileInfo
ไฟล์สามารถโหลดด้วยคลาส FileInfo แล้วเพิ่มลงในอาร์ไคฟ์ด้วยวิธีเดียวกับก่อนหน้า.
คลาส FileInfo ให้คุณสมบัติและเมธอดอินสแตนซ์สำหรับการสร้าง, คัดลอก, ลบ, ย้าย, และเปิดไฟล์, รวมถึงช่วยสร้างอ็อบเจ็กต์ FileStream.
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
// Files to be added to archive
FileInfo fi1 = new FileInfo("alice29.txt");
FileInfo fi2 = new FileInfo("fields.c");
using (var archive = new Archive())
{
// Add files to the archive
archive.CreateEntry("alice29.txt", fi1);
archive.CreateEntry("fields.c", fi2);
// Create ZIP archive
archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
}
}
เก็บไฟล์ลงในอาร์ไคฟ์โดยไม่บีบอัด
//Creates zip archive without compressing files
using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Create))
{
FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
FileInfo fi2 = new FileInfo(dataDir + "lcet10.txt");
using (Archive archive = new Archive(new ArchiveEntrySettings(new StoreCompressionSettings())))
{
archive.CreateEntry("alice29.txt", fi1);
archive.CreateEntry("lcet10.txt", fi2);
archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
}
}
วิธีบีบอัดไฟล์ด้วยรหัสผ่านใน C#
using (var archive = new Archive(new ArchiveEntrySettings(encryptionSettings: new TraditionalEncryptionSettings("pass"))))
{
archive.CreateEntry("entry_name1.dat", "input_file1.dat");
archive.CreateEntry("entry_name2.dat", "input_file2.dat");
archive.Save("result_archive.zip");
}
พารามิเตอร์ encryptionSettings ใช้สำหรับสร้างอาร์ไคฟ์ ZIP ที่มีการป้องกันด้วยรหัสผ่าน.
วิธีแตกไฟล์ด้วยรหัสผ่านใน C#
using (var archive = new Archive("input_archive.zip", new ArchiveLoadOptions{DecryptionPassword = "pass"}))
{
archive.ExtractToDirectory("\\outputDirectory");
}
ArchiveLoadOptions พร้อมค่า DecryptionPassword ใช้เพื่อเปิดอาร์ไคฟ์ ZIP ที่มีการป้องกันด้วยรหัสผ่าน.
เพื่อดูตัวอย่างและไฟล์ข้อมูลทั้งหมด โปรดไปที่ https://github.com/aspose-zip/Aspose.ZIP-for-.NET
.
การใช้การบีบอัด LZMA ภายในอาร์ไคฟ์ ZIP
อัลกอริทึม Lempel–Ziv–Markov chain (LZMA) เป็นอัลกอริทึมที่ใช้ทำการบีบอัดข้อมูลแบบไม่มีการสูญเสีย. LZMA ใช้อัลกอริทึมการบีบอัดแบบพจนานุกรม, สตรีมที่บีบอัดเป็นสตรีมของบิต. การบีบอัด LZMA ภายในอาร์ไคฟ์ ZIP ทำให้คอนเทนเนอร์ ZIP สามารถบรรจุรายการที่บีบอัดด้วย LZMA ได้. ตัวอย่างโค้ดต่อไปนี้แสดงการใช้งานการบีบอัด LZMA ด้วย Aspose.ZIP API
.
using (FileStream zipFile = File.Open(dataDir + "LZMACompression_out.zip", FileMode.Create))
{
using (Archive archive = new Archive(new ArchiveEntrySettings(new LzmaCompressionSettings())))
{
archive.CreateEntry("sample.txt", dataDir + "sample.txt");
archive.Save(zipFile);
}
}
การใช้การบีบอัด BZip2 ภายในอาร์ไคฟ์ ZIP
bzip2 เป็นโปรแกรมบีบอัดไฟล์แบบเปิดเผยและฟรีที่ใช้อัลกอริทึม Burrows–Wheeler. มันบีบอัดได้เฉพาะไฟล์เดี่ยวและไม่ใช่ตัวจัดเก็บไฟล์. โปรแกรมนี้พัฒนาโดย Julian Seward และได้รับการดูแลโดย Mark Wielaard และ Micah Snyder. ตัวอย่างโค้ดต่อไปนี้แสดงการใช้งานการบีบอัด BZip2 ด้วย Aspose.ZIP API
.
using (FileStream zipFile = File.Open(dataDir + "Bzip2Compression_out.zip", FileMode.Create))
{
using (Archive archive = new Archive(new ArchiveEntrySettings(new Bzip2CompressionSettings())))
{
archive.CreateEntry("sample.txt", dataDir + "sample.txt");
archive.Save(zipFile);
}
}
การใช้การบีบอัด PPMd ภายในอาร์ไคฟ์ ZIP
Prediction by partial matching (PPM) เป็นเทคนิคการบีบอัดข้อมูลเชิงสถิติแบบปรับตัวที่อิงกับการสร้างโมเดลบริบทและการทำนาย. โมเดล PPM ใช้ชุดสัญลักษณ์ก่อนหน้าในสตรีมสัญลักษณ์ที่ไม่ได้บีบอัดเพื่อทำนายสัญลักษณ์ถัดไป. อัลกอริทึม PPM ยังสามารถใช้ในการจัดกลุ่มข้อมูลตามการทำนายในกระบวนการวิเคราะห์คลัสเตอร์. ตัวอย่างโค้ดต่อไปนี้แสดงการใช้งานการบีบอัด PPMd ด้วย Aspose.ZIP API
.
using (FileStream zipFile = File.Open(dataDir + "PPMdCompression_out.zip", FileMode.Create))
{
using (Archive archive = new Archive(new ArchiveEntrySettings(new PPMdCompressionSettings())))
{
archive.CreateEntry("sample.txt", dataDir + "sample.txt");
archive.Save(zipFile);
}
}
แตกอาร์ไคฟ์ด้วยไฟล์เดียว
using (FileStream fs = File.OpenRead(dataDir + "CompressSingleFile_out.zip"))
{
using (Archive archive = new Archive(fs))
{
int percentReady = 0;
archive.Entries[0].ExtractionProgressed += (s, e) =>
{
int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
if (percent > percentReady)
{
Console.WriteLine(string.Format("{0}% decompressed", percent));
percentReady = percent;
}
};
archive.Entries[0].Extract(dataDir + "alice_extracted_out.txt");
}
}
แตกอาร์ไคฟ์ด้วยหลายไฟล์
using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Open))
{
StringBuilder sb = new StringBuilder("Entries are: ");
int percentReady = 0;
using (Archive archive = new Archive(zipFile,
new ArchiveLoadOptions()
{
EntryListed = (s, e) => { sb.AppendFormat("{0}, ", e.Entry.Name); },
EntryExtractionProgressed = (s, e) =>
{
int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
if (percent > percentReady)
{
Console.WriteLine(string.Format("{0}% compressed", percent)); percentReady = percent;
}
}
}))
{
Console.WriteLine(sb.ToString(0, sb.Length - 2));
using (var extracted = File.Create(dataDir + "alice_extracted_out.txt"))
{
using (var decompressed = archive.Entries[0].Open())
{
byte[] buffer = new byte[8192];
int bytesRead;
while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
{
extracted.Write(buffer, 0, bytesRead);
}
// Read from decompressed stream to extracting file.
}
}
percentReady = 0;
archive.Entries[1].Extract(dataDir + "asyoulik_extracted_out.txt");
}
}
แยกอาร์ไคฟ์ที่เก็บไว้โดยไม่บีบอัด
using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Open))
{
using (Archive archive = new Archive(zipFile))
{
using (var extracted = File.Create(dataDir + "alice_extracted_store_out.txt"))
{
using (var decompressed = archive.Entries[0].Open())
{
byte[] buffer = new byte[8192];
int bytesRead;
while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
{
extracted.Write(buffer, 0, bytesRead);
}
// Read from decompressed stream to extracting file.
}
}
using (var extracted = File.Create(dataDir + "asyoulik_extracted_store_out.txt"))
{
using (var decompressed = archive.Entries[1].Open())
{
byte[] buffer = new byte[8192];
int bytesRead;
while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
{
extracted.Write(buffer, 0, bytesRead);
}
// Read from decompressed stream to extracting file.
}
}
}
}
เพื่อดูตัวอย่างและไฟล์ข้อมูลทั้งหมด โปรดไปที่ https://github.com/aspose-zip/Aspose.ZIP-for-.NET
.