Ricerca…


introduzione

La classe ZipFile risiede nello spazio dei nomi System.IO.Compression . Può essere utilizzato per leggere e scrivere su file Zip.

Osservazioni

  • Puoi anche usare un MemoryStream invece di un FileStream.

  • eccezioni

Eccezione Condizione
ArgumentException Lo stream è già stato chiuso o le funzionalità dello stream non corrispondono alla modalità (ad esempio: provare a scrivere su un flusso di sola lettura)
ArgumentNullException il flusso di input è nullo
ArgumentOutOfRangeException la modalità ha un valore non valido
InvalidDataException Vedi la lista qui sotto

Quando viene lanciata una InvalidDataException , può avere 3 cause:

  • Il contenuto dello stream non può essere interpretato come un archivio zip
  • la modalità è Aggiorna e manca una voce dall'archivio o è corrotta e non può essere letta
  • la modalità è Aggiorna e una voce è troppo grande per adattarsi alla memoria

Tutte le informazioni sono state prese da questa pagina MSDN

Elenco dei contenuti ZIP

Questo frammento elencherà tutti i nomi di file di un archivio zip. I nomi dei file sono relativi alla radice zip.

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]}");
    }
}

Estrazione di file da file ZIP

Estrarre tutti i file in una directory è molto semplice:

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
    archive.ExtractToDirectory(AppDomain.CurrentDomain.BaseDirectory);
}

Quando il file esiste già, verrà lanciata una System.IO.IOException .

Estrazione di file specifici:

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);
}

Ognuno di questi metodi produrrà lo stesso risultato.

Aggiornamento di un file ZIP

Per aggiornare un file ZIP, il file deve essere aperto con ZipArchiveMode.Update.

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");
}

C'è anche la possibilità di scrivere direttamente in un file all'interno dell'archivio:

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow