DotNetZip: Wie Dateien extrahieren, aber den Pfad in der Zip-Datei zu ignorieren?

StackOverflow https://stackoverflow.com/questions/2405758

  •  18-09-2019
  •  | 
  •  

Frage

Der Versuch, Dateien in einem bestimmten Ordner zu extrahieren, den Pfad in der Zip-Datei zu ignorieren, aber es scheint nicht so zu sein.

Dies scheint eine ziemlich grundlegende Anforderung dort implementiert alles andere gute Sachen gegeben.

Was bin ich fehlt?

Code -

using (Ionic.Zip.ZipFile zf = Ionic.Zip.ZipFile.Read(zipPath))
{
    zf.ExtractAll(appPath);
}
War es hilfreich?

Lösung

Sie müssen das Verzeichnis Teil des Dateinamens entfernen kurz vor dem Entpacken ...

using (var zf = Ionic.Zip.ZipFile.Read(zipPath))
{
    zf.ToList().ForEach(entry =>
    {
        entry.FileName = System.IO.Path.GetFileName(entry.FileName);
        entry.Extract(appPath);
    });
}

Andere Tipps

Während Sie es nicht für einen bestimmten Aufruf Extract() oder ExtractAll() angeben kann, hat die ZipFile Klasse ein FlattenFoldersOnExtract Feld. Wenn auf true gesetzt, es flacht alle extrahierten Dateien in einem Ordner:

var flattenFoldersOnExtract = zip.FlattenFoldersOnExtract;
zip.FlattenFoldersOnExtract = true;
zip.ExtractAll();
zip.FlattenFoldersOnExtract = flattenFoldersOnExtract;

Das wird fehlschlagen, wenn es 2 Dateien mit dem gleichen Dateinamen. Zum Beispiel Dateien \ additionalfiles \ file1.txt temp \ file1.txt

Erste-Datei in der ZIP-Datei in file1.txt umbenannt wird und wenn die zweite Datei eine Ausnahme werden versucht, umbenannt wird geworfen zu sagen, dass ein Element mit demselben Schlüssel ist bereits vorhanden

Sie können die Überlastung verwenden, die einen Strom als Parameter annimmt. Auf diese Weise haben Sie die volle Kontrolle über Pfad, in dem die Dateien extrahiert werden.

Beispiel:

using (ZipFile zip = new ZipFile(ZipPath))
{
     foreach (ZipEntry e in zip)
     {
        string newPath = Path.Combine(FolderToExtractTo, e.FileName);

        if (e.IsDirectory)
        {
           Directory.CreateDirectory(newPath);
        }
        else
        {
          using (FileStream stream = new FileStream(newPath, FileMode.Create))
             e.Extract(stream);
        }
     }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top