ZIP er et arkivfilformat, der understøtter tabsfri datakomprimering. En ZIP‑fil kan indeholde én eller flere filer eller mapper, som er blevet komprimeret. ZIP‑filer bruger typisk filendelserne .zip eller .ZIP og MIME‑medietypen application/zip. ZIP anvendes som grundlæggende filformat af mange programmer, ofte under et andet navn. Når man navigerer i et filsystem via en brugergrænseflade, vises grafiske ikoner, der repræsenterer ZIP‑filer, ofte som et dokument eller et andet objekt med en tydelig lynlås.
Der findes flere måder at zippe (komprimere) filer på
, afhængigt af hvilket operativsystem du bruger. Og næsten hver dag skal vi zippe eller pakke nogle filer ud og overføre dem til en lagringsserver eller en fildelingsplatform. Heldigvis kan vi automatisere denne proces ved hjælp af Aspose.ZIP API
. Det giver dig mulighed for at komprimere og dekomprimere filer uden at bekymre dig om den underliggende filstruktur. Denne artikel viser, hvordan du arbejder med både enkelt‑ og flere‑fil‑komprimering.
Aspose.ZIP‑pakken kan tilføjes til dit .NET‑projekt ved hjælp af følgende NuGet‑kommando:
PM> Install-Package Aspose.Zip
Sådan komprimeres en enkelt fil med C#
- Først skal vi oprette et objekt af FileStream class
til output‑ZIP‑arkivet
- Indlæs en enkelt fil i FileStream
-objektet
- Opret et objekt af Archive class
- Tilføj filen til arkivet ved hjælp af Archive.CreateEntry
‑metoden (“FileName”, FileStream).
- Opret ZIP‑arkivet ved hjælp af Archive.Save
‑metoden (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);
}
}
}
Komprimering af flere filer med C#
Forskellen mellem at komprimere en enkelt fil og flere filer er, at vi skal indlæse flere filer i FileStream og tilføje dem alle til ZIP‑arkivet ved hjælp af metoden Archive.CreateEntry("FileName", FileStream).
Følgende kodeudsnit viser, hvordan du tilføjer flere filer til ZIP ved hjælp af 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 hjælp af FileInfo‑klassen
Filer kan også indlæses ved hjælp af FileInfo‑klassen og derefter tilføjes til ZIP‑arkivet på samme måde som før.
FileInfo‑klassen giver egenskaber og instansmetoder til oprettelse, kopiering, sletning, flytning og åbning af filer samt hjælper med oprettelse af 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 });
}
}
Gem filer i arkiver uden 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 });
}
}
Sådan ZIP‑filer med adgangskode 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 bruges til at oprette et adgangskodebeskyttet ZIP‑arkiv.
Sådan UNZIP‑filer med adgangskode i C#
using (var archive = new Archive("input_archive.zip", new ArchiveLoadOptions{DecryptionPassword = "pass"}))
{
archive.ExtractToDirectory("\\outputDirectory");
}
ArchiveLoadOptions med DecryptionPassword‑egenskaben bruges til at åbne et adgangskodebeskyttet ZIP‑arkiv.
For at se komplette eksempler og datafiler, gå til https://github.com/aspose-zip/Aspose.ZIP-for-.NET
.
Brug af LZMA‑komprimering i ZIP‑arkiv
Lempel–Ziv–Markov‑kæde‑algoritmen (LZMA) er en algoritme, der anvendes til tabsfri datakomprimering. LZMA bruger en ordbogs‑komprimeringsalgoritme, hvor den komprimerede strøm er en bit‑strøm. LZMA‑komprimering i ZIP‑arkivet gør det muligt for ZIP‑containere at indeholde LZMA‑komprimerede poster. Følgende kodeeksempel viser implementeringen af LZMA‑komprimering ved hjælp af 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);
}
}
Brug af BZip2‑komprimering i ZIP‑arkiv
bzip2 er et gratis og open‑source filkomprimeringsprogram, der bruger Burrows–Wheeler‑algoritmen. Det komprimerer kun enkeltfiler og er ikke et filarkiveringsværktøj. Det blev udviklet af Julian Seward og vedligeholdes af Mark Wielaard og Micah Snyder. Følgende kodeudsnit viser implementeringen af BZip2‑komprimering ved hjælp af 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);
}
}
Brug af PPMd‑komprimering i ZIP‑arkiv
Prediction by partial matching (PPM) er en adaptiv statistisk datakomprimeringsteknik baseret på kontekst‑modellering og forudsigelse. PPM‑modeller bruger et sæt af tidligere symboler i den ukomprimerede symbolstrøm til at forudsige det næste symbol i strømmen. PPM‑algoritmer kan også anvendes til at gruppere data i forudsagte grupper i klyngeanalyse. Følgende kodeudsnit viser implementeringen af PPMd‑komprimering ved hjælp af 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 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");
}
}
Udtræk gemt arkiv uden 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 at se komplette eksempler og datafiler, gå til https://github.com/aspose-zip/Aspose.ZIP-for-.NET