2013-02-10 6 views
15

Ich verwende den folgenden Code alle Dateien in einem Ordner vorhandenErzwingen Sie beim Extrahieren von Dateien mit System.IO.Compression erzwungene Dateien?

 using (ZipArchive archive = new ZipArchive(zipStream)) 
     { 
      archive.ExtractToDirectory(location); 
     } 

Aber wenn eine Datei zu extrahieren, dann wirft er eine Ausnahme. Gibt es eine Möglichkeit, der Compression API mitzuteilen, die vorhandenen Dateien zu ersetzen?

Ich fand eine Möglichkeit ist, alle Dateinamen zuerst zu bekommen, dann prüfen, ob die Datei existiert und sie löschen. Aber das ist irgendwie sehr teuer für mich.

Antwort

37

Ich habe eine Erweiterung erstellt. jeder Kommentar zu es wird sich verbessern geschätzt werden,

public static class ZipArchiveExtensions 
{ 
    public static void ExtractToDirectory(this ZipArchive archive, string destinationDirectoryName, bool overwrite) 
    { 
     if (!overwrite) 
     { 
      archive.ExtractToDirectory(destinationDirectoryName); 
      return; 
     } 
     foreach (ZipArchiveEntry file in archive.Entries) 
     { 
      string completeFileName = Path.Combine(destinationDirectoryName, file.FullName); 
      if (file.Name == "") 
      {// Assuming Empty for Directory 
       Directory.CreateDirectory(Path.GetDirectoryName(completeFileName)); 
       continue; 
      } 
      file.ExtractToFile(completeFileName, true); 
     } 
    } 
} 
+0

Dies funktioniert wie ein Charme. – Ravia

+0

Ist dies mit der eingebauten ZipFile-Klasse möglich? – Pedro77

2

Sie können Dateien in ein temporäres Verzeichnis extrahieren und als das Kopieren von Dateien mit dem „File.Copy“ mit der ovveride Option wahr zu Ihrem Zielverzeichnis

Ich weiß, dass es keine perfekte Lösung ist, aber diese Weise können Sie muss nicht überprüfen, ob die Datei existiert

+0

Ich habe auch diesen Tipp in meinen Gedanken, aber es ist sehr teuer für mich. – user960567

+0

Ich denke, Sie haben keine andere Option, außer mit anderen Rahmen –

11

Dieser Code wird nicht Ausnahme auslösen, wenn der Ordner ist nicht vorhanden, statt dass sie den Ordner erstellen wird.

public static class ZipArchiveExtensions 
{ 
    public static void ExtractToDirectory(this ZipArchive archive, string destinationDirectoryName, bool overwrite) 
    { 
     if (!overwrite) 
     { 
      archive.ExtractToDirectory(destinationDirectoryName); 
      return; 
     } 
     foreach (ZipArchiveEntry file in archive.Entries) 
     { 
      string completeFileName = Path.Combine(destinationDirectoryName, file.FullName); 
      string directory = Path.GetDirectoryName(completeFileName); 

      if (!Directory.Exists(directory)) 
       Directory.CreateDirectory(directory); 

      if (file.Name != "") 
       file.ExtractToFile(completeFileName, true); 
     } 
    } 
} 
+3

nicht eine Kopie Katze – FrostyFire

+2

JABFreeware, wie @ user960567 sagte "jeder Kommentar zu ihr verbessern wird geschätzt werden," ich nur ein paar Zeilen hinzufügen, um das Auslösen von Ausnahmen zu verhindern! if (! Directory.Exists (Verzeichnis)) Directory.CreateDirectory (Verzeichnis); – Mohy66

+0

Coooommmmmmmmmmeennnnnnt nicht beantworten. Wenn Sie kommentieren, wird er benachrichtigt und kann seinen Code bearbeiten :) – FrostyFire

Verwandte Themen