DotNetZip: Wie Dateien extrahieren, aber den Pfad in der Zip-Datei zu ignorieren?
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);
}
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);
}
}
}