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