A ZIP egy archívum fájlformátum, amely veszteségmentes adatkompressziót támogat. Egy ZIP fájl egy vagy több, esetleg tömörített fájlt vagy könyvtárat tartalmazhat. A ZIP fájlok általában a .zip vagy .ZIP kiterjesztést, valamint az application/zip MIME típust használják. Számos program alapfájlformátumként használja a ZIP-et, gyakran más néven. Fájlkezelő felületen a ZIP fájlokat gyakran egy dokumentumként vagy egy zárócsíkkal ábrázolt ikon jeleníti meg.
Számos többféle módja a fájlok ZIP-olásának (tömörítésének)
létezik, attól függően, hogy melyik operációs rendszert használja. Szinte minden nap ZIP-olni vagy kicsomagolni kell fájlokat, majd továbbküldeni őket egy tárolószerverre vagy fájlmegosztó platformra. Szerencsére ezt a folyamatot automatizálhatja az Aspose.ZIP API
segítségével. Lehetővé teszi a fájlok tömörítését és kitömörítését anélkül, hogy a háttérben lévő fájlszerkezet miatt aggódna. Ez a cikk bemutatja az egy- és többfájlos tömörítés használatát.
Aspose.ZIP csomag a következő NuGet paranccsal adható hozzá a .NET projektjéhez:
PM> Install-Package Aspose.Zip
Hogyan tömörítsünk egyetlen fájlt C#-ban
- Először létre kell hoznunk egy FileStream class objektumot a kimeneti ZIP archívumhoz.
- Töltsünk be egyetlen fájlt a FileStream objektumba.
- Hozzunk létre egy objektumot az Archive class‑ból.
- Adjunk hozzá egy fájlt az archívumhoz a Archive.CreateEntry („FileName”, FileStream) metódussal.
- Hozzuk létre a ZIP archívumot a Archive.Save (FileStream) metódussal.
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);
}
}
}
Több fájl tömörítése C#-ban
Az egyetlen fájl és a több fájl tömörítése közti különbség, hogy több fájlt kell betölteni a FileStream‑be, majd mindet hozzáadni a ZIP archívumhoz az Archive.CreateEntry(“FileName”, FileStream) metódussal.
Az alábbi kódrészlet bemutatja, hogyan adhatunk több fájlt a ZIP-hez FileStream használatával.
// 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" });
}
}
}
}
Fájlok tömörítése a FileInfo osztály használatával
A fájlok betölthetők a FileInfo osztály segítségével is, majd ugyanúgy hozzáadhatók a ZIP archívumhoz, mint korábban.
A FileInfo osztály tulajdonságokat és példánymetódusokat biztosít a fájlok létrehozásához, másolásához, törléséhez, áthelyezéséhez és megnyitásához, valamint segíti a FileStream objektumok létrehozását.
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 });
}
}
Fájlok tárolása archívumokban tömörítés nélkül
//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 });
}
}
Hogyan ZIP-eljünk jelszóval védett fájlokat C#-ban
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");
}
Az encryptionSettings paraméterrel jelszóval védett ZIP archívum hozható létre.
Hogyan csomagoljunk ki jelszóval védett ZIP fájlokat C#-ban
using (var archive = new Archive("input_archive.zip", new ArchiveLoadOptions{DecryptionPassword = "pass"}))
{
archive.ExtractToDirectory("\\outputDirectory");
}
Az ArchiveLoadOptions DecryptionPassword tulajdonsága a jelszóval védett ZIP archívum megnyitásához szükséges.
A teljes példák és adatfájlok megtekintéséhez látogasson el a https://github.com/aspose-zip/Aspose.ZIP-for-.NET
oldalra.
LZMA tömörítés használata ZIP archívumban
A Lempel–Ziv–Markov lánc algoritmus (LZMA) egy veszteségmentes adatkompressziós algoritmus. Az LZMA szótár alapú tömörítést alkalmaz, a tömörített adatfolyam bitfolyam. Az LZMA tömörítés a ZIP archívumban lehetővé teszi, hogy a ZIP konténerek LZMA-val tömörített bejegyzéseket tartalmazzanak. Az alábbi kó példa bemutatja az LZMA tömörítés megvalósítását az Aspose.ZIP API
segítségével.
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 tömörítés használata ZIP archívumban
A bzip2 egy szabad és nyílt forráskódú fájltömörítő program, amely a Burrows–Wheeler algoritmust használja. Csak egyetlen fájlt tömörít, és nem archívumkezelő. Fejlesztője Julian Seward, karbantartói pedig Mark Wielaard és Micah Snyder. Az alábbi kódrészlet bemutatja a BZip2 tömörítés megvalósítását az Aspose.ZIP API
segítségével.
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 tömörítés használata ZIP archívumban
A Prediction by Partial Matching (PPM) egy adaptív statisztikai adatkompressziós technika, amely kontextusmodellezésen és előrejelzésen alapul. A PPM modellek a nem tömörített szimbólumfolyamban lévő korábbi szimbólumok halmazát használják a következő szimbólum előrejelzésére. A PPM algoritmusok adatcsoportosításra is alkalmazhatók klaszterelemzés során. Az alábbi kódrészlet bemutatja a PPMd tömörítés megvalósítását az Aspose.ZIP API
segítségével.
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);
}
}
Archívum kitömörítése egyetlen fájllal
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");
}
}
Archívum kitömörítése több fájllal
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");
}
}
Tárolt archívum kicsomagolása tömörítés nélkül
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.
}
}
}
}
A teljes példák és adatfájlok megtekintéséhez látogasson el a https://github.com/aspose-zip/Aspose.ZIP-for-.NET
oldalra.