2017-12-06 2 views
0

Ich habe ein Problem mit einer Zip-Datei ersetzen eine vorhandene Datei. Ich habe andere Beispiele hier angeschaut und ich kann es immer noch nicht herausfinden ... Ich habe eine loop, die einige Statistiken der extrahierten Datei in ein Textfeld schreibt. Ich denke, dass seine diese Zeile:Entpacken nicht ersetzen Datei

if (!System.IO.File.Exists(fileUnzipFullName))

Mein Code:

public void UnzipFileNew() 
    { 
     richTextBox1.AppendText("\r\n" + "EXTRACTING!"); 

     String rootpath = Environment.CurrentDirectory; 
     //This stores the path where the file should be unzipped to, 
     //including any subfolders that the file was originally in. 
     string fileUnzipFullPath; 

     //This is the full name of the destination file including 
     //the path 
     string fileUnzipFullName; 

     //Opens the zip file up to be read 
     using (ZipArchive archive = ZipFile.OpenRead(@"update.zip")) 
     { 
      //Loops through each file in the zip file 
      foreach (ZipArchiveEntry file in archive.Entries) 
      { 

       //Outputs file information to the Textbox 
       richTextBox1.AppendText("\r\n"); 
       richTextBox1.AppendText("File Name: "+ file.Name); 
       richTextBox1.AppendText("\r\n"); 
       richTextBox1.AppendText("File Size: bytes "+ file.Length); 
       richTextBox1.AppendText("\r\n"); 
       richTextBox1.AppendText("Compression Ratio: "+ ((double)file.CompressedLength/file.Length).ToString("0.0%")); 
       richTextBox1.AppendText("\r\n"); 

       //Identifies the destination file name and path 
       fileUnzipFullName = Path.Combine(rootpath, file.FullName); //fileUnzipFullName = Path.Combine(@"Example\", file.FullName); 

       //Extracts 
       if (!System.IO.File.Exists(fileUnzipFullName)) 
       { 

        fileUnzipFullPath = Path.GetDirectoryName(fileUnzipFullName); 

        //Creates the directory if it doesn't exist 
        Directory.CreateDirectory(fileUnzipFullPath); 

        //Extracts the file to (potentially new) path 
        file.ExtractToFile(fileUnzipFullName); 
       } 

      } 
     } 
    } 

Antwort

1

if (!System.IO.File.Exists(fileUnzipFullName)) wird in der Tat verhindern, dass Sie auch nur zu versuchen, die Datei zu extrahieren, wenn sie bereits vorhanden ist. Sie müssen dies also entfernen oder gemäß Ihrem Anwendungsfall ändern.

Darüber hinaus wird die ExtractToFile Methode eine IOException werfen, wenn die Datei bereits existiert, wie Sie es verwenden. Glücklicherweise zeigt MSDN, dass es eine Überlastung mit einem boolean-Flag zum Überschreiben:

public static void ExtractToFile(
    this ZipArchiveEntry source, 
    string destinationFileName, 
    bool overwrite 
) 

Also statt

file.ExtractToFile(fileUnzipFullName); 

Verwendung

file.ExtractToFile(fileUnzipFullName, true); 

Code verwenden, diesen Willen wahllos überschreiben alle Dateien mit denen aus der zip extrahiert:

//Extracts 
//if (!System.IO.File.Exists(fileUnzipFullName)) 
//{ 
    fileUnzipFullPath = Path.GetDirectoryName(fileUnzipFullName); 

    //Creates the directory if it doesn't exist 
    Directory.CreateDirectory(fileUnzipFullPath); 

    //Extracts the file to (potentially new) path 
    file.ExtractToFile(fileUnzipFullName, true); 
//} 
+0

Danke John! Das hat funktioniert! Ich habe der ZIP-Datei einen Ordner mit einer Datei hinzugefügt, um eine andere Datei in einem Ordner im Stammverzeichnis zu ersetzen. Ich habe einen Fehler: 'System.IO.DirectoryNotFoundException: 'Konnte einen Teil des Pfades' C: \ Users \ stump \ source \ repos \ UpdaterTest \ UpdaterTest \ bin \ Debug \ resources \ test \ 'nicht finden.' 'es wird in der gleichen' Datei geworfen.ExtractToFile (fileUnzipFullName, true); ' – javajoejuan

+0

Oh, ich denke, Sie brauchen den tatsächlichen _Dateiname_. IIRC 'GetDirectoryName' liefert nur das Verzeichnis. Wenn Sie diese Zeile auskommentieren, sollte es funktionieren. – john

+0

Nochmals vielen Dank für die Antwort! aber ich schien Fehler zu bekommen, wenn ich diese Zeile kommentierte. Ich habe auch die anderen Linien versucht, die mit 'GetDirectoryName' verbunden sind – javajoejuan

Verwandte Themen