.NET Framework
Läsa och skriva zip-filer
Sök…
Introduktion
Klassen ZipFile lever i System.IO.Compression- namnområdet. Det kan användas för att läsa från och skriva till zip-filer.
Anmärkningar
Du kan också använda ett MemoryStream istället för FileStream.
undantag
Undantag | Tillstånd |
---|---|
ArgumentException | Strömmen har redan stängts, eller strömmens funktioner överensstämmer inte med läget (t.ex.: försöker skriva till en skrivskyddad ström) |
ArgumentNullException | inmatningsströmmen är null |
ArgumentOutOfRangeException | läget har ogiltigt värde |
InvalidDataException | Se listan nedan |
När en InvalidDataException kastas kan den ha tre orsaker:
- Innehållet i strömmen kunde inte tolkas som ett zip-arkiv
- läget är Uppdatering och en post saknas i arkivet eller är skadad och kan inte läsas
- läget är Update och en post är för stor för att passa in i minnet
All information har hämtats från denna MSDN-sida
Lista ZIP-innehåll
Det här fragmentet visar alla filnamn i ett zip-arkiv. Filnamnen är relativt zip-roten.
using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
for (int i = 0; i < archive.Entries.Count; i++)
{
Console.WriteLine($"{i}: {archive.Entries[i]}");
}
}
Extrahera filer från ZIP-filer
Att extrahera alla filer till en katalog är mycket enkelt:
using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
archive.ExtractToDirectory(AppDomain.CurrentDomain.BaseDirectory);
}
När filen redan finns kastas en System.IO.IOException .
Extrahera specifika filer:
using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
// Get a root entry file
archive.GetEntry("test.txt").ExtractToFile("test_extracted_getentries.txt", true);
// Enter a path if you want to extract files from a subdirectory
archive.GetEntry("sub/subtest.txt").ExtractToFile("test_sub.txt", true);
// You can also use the Entries property to find files
archive.Entries.FirstOrDefault(f => f.Name == "test.txt")?.ExtractToFile("test_extracted_linq.txt", true);
// This will throw a System.ArgumentNullException because the file cannot be found
archive.GetEntry("nonexistingfile.txt").ExtractToFile("fail.txt", true);
}
Vilken som helst av dessa metoder ger samma resultat.
Uppdaterar en ZIP-fil
För att uppdatera en ZIP-fil måste filen öppnas med ZipArchiveMode.Update istället.
using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Update))
{
// Add file to root
archive.CreateEntryFromFile("test.txt", "test.txt");
// Add file to subfolder
archive.CreateEntryFromFile("test.txt", "symbols/test.txt");
}
Det finns också möjlighet att skriva direkt till en fil i arkivet:
var entry = archive.CreateEntry("createentry.txt");
using(var writer = new StreamWriter(entry.Open()))
{
writer.WriteLine("Test line");
}
Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow