ZIP er et arkivfilformat som støtter tapsfri datakomprimering. En ZIP‑fil kan inneholde én eller flere filer eller kataloger som er komprimert. ZIP‑filer bruker vanligvis filendelsene .zip eller .ZIP og MIME‑medietypen application/zip. ZIP brukes som grunnfilformat av mange programmer, ofte under et annet navn. Når du navigerer i et filsystem via et brukergrensesnitt, vises grafiske ikoner som representerer ZIP‑filer ofte som et dokument eller et annet objekt med en tydelig glidelås.
Det finnes flere måter å komprimere (zippe) filer
, avhengig av hvilket operativsystem du bruker. Og nesten hver dag må vi zippe eller unzippe noen filer og sende dem videre til en lagringsserver eller en fildelingsplattform. Heldigvis kan vi automatisere denne prosessen ved hjelp av Aspose.ZIP API
. Den lar deg komprimere og dekomprimere filer uten å bekymre deg for den underliggende filstrukturen. Denne artikkelen viser hvordan du arbeider med både enkel‑ og flerfilskomprimering.
Aspose.ZIP‑pakken kan legges til ditt .NET‑prosjekt med følgende NuGet‑kommando:
PM> Install-Package Aspose.Zip
Hvordan komprimere en enkelt fil med C#
- Først må vi opprette et objekt av FileStream class
for ZIP‑arkivet som skal opprettes
- Last inn en enkelt fil i FileStream
‑objektet
- Opprett et objekt av Archive class
- Legg til filen i arkivet ved å bruke Archive.CreateEntry
( “FileName”, FileStream)-metoden.
- Opprett ZIP‑arkivet ved å bruke Archive.Save
(FileStream)-metoden.
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);
}
}
}
Komprimere flere filer med C#
Forskjellen mellom å komprimere en enkelt fil og flere filer er at vi må laste inn flere filer i FileStream og legge dem alle til ZIP‑arkivet ved hjelp av metoden Archive.CreateEntry("FileName", FileStream).
Kodesnutten nedenfor viser hvordan du legger til flere filer i ZIP ved hjelp av 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" });
}
}
}
}
Komprimer filer ved hjelp av FileInfo‑klassen
Filer kan også lastes inn ved hjelp av FileInfo‑klassen og senere legges til ZIP‑arkivet på samme måte som før.
FileInfo‑klassen gir egenskaper og instansmetoder for opprettelse, kopiering, sletting, flytting og åpning av filer, og hjelper til med opprettelse av FileStream‑objekter.
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 });
}
}
Lagring av filer i arkiver uten komprimering
//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 });
}
}
Hvordan ZIP‑e filer med passord i 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‑parameteren brukes til å opprette et passordbeskyttet ZIP‑arkiv.
Hvordan UNZIP‑e filer med passord i C#
using (var archive = new Archive("input_archive.zip", new ArchiveLoadOptions{DecryptionPassword = "pass"}))
{
archive.ExtractToDirectory("\\outputDirectory");
}
ArchiveLoadOptions med DecryptionPassword‑egenskapen brukes til å åpne et passordbeskyttet ZIP‑arkiv.
For å se komplette eksempler og datafiler, gå til https://github.com/aspose-zip/Aspose.ZIP-for-.NET
.
Bruke LZMA‑komprimering i ZIP‑arkiv
Lempel–Ziv–Markov‑kjede‑algoritmen (LZMA) er en algoritme som brukes til tapsfri datakomprimering. LZMA benytter en ordbok‑komprimeringsalgoritme, og den komprimerte strømmen er en strøm av biter. LZMA‑komprimering i ZIP‑arkivet gjør det mulig for ZIP‑containere å inneholde LZMA‑komprimerte oppføringer. Kodeeksemplet nedenfor viser implementeringen av LZMA‑komprimering ved hjelp av 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);
}
}
Bruke BZip2‑komprimering i ZIP‑arkiv
bzip2 er et gratis og åpen kildekode‑filkomprimeringsprogram som bruker Burrows–Wheeler‑algoritmen. Det komprimerer kun enkeltfiler og er ikke et filarkiveringsprogram. Det ble utviklet av Julian Seward, og vedlikeholdes av Mark Wielaard og Micah Snyder. Kodesnutten nedenfor viser implementeringen av BZip2‑komprimering ved hjelp av 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);
}
}
Bruke PPMd‑komprimering i ZIP‑arkiv
Prediction by partial matching (PPM) er en adaptiv statistisk datakomprimeringsteknikk basert på kontekstmodellering og prediksjon. PPM‑modeller bruker et sett med tidligere symboler i den ukomprimerte symbolstrømmen for å forutsi neste symbol i strømmen. PPM‑algoritmer kan også brukes til å gruppere data i predikerte grupperinger i klyngeanalyse. Kodesnutten nedenfor viser implementeringen av PPMd‑komprimering ved hjelp av 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);
}
}
Dekomprimer arkiv med en enkelt fil
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");
}
}
Dekomprimer arkiv med flere filer
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");
}
}
Hent lagret arkiv uten komprimering
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.
}
}
}
}
For komplette eksempler og datafiler, gå til https://github.com/aspose-zip/Aspose.ZIP-for-.NET