2016-08-04 76 views
0

Eigentlich versuche ich, Zip-Datei eines Verzeichnisses zu erstellen und aber die ZipFile.CreateFromDirectory() unter Ausnahme geben.System.IO.IOException: Der Prozess kann nicht auf die Datei PATH_TO_CREATE_ZIP/file.zip 'zugreifen, weil es von einem anderen Prozess verwendet wird

System.IO.IOException: Der Prozess kann nicht auf die Datei zugreifen PATH_TO_CREATE_ZIP/file.zip‘, weil sie von einem anderen Prozess verwendet wird.

Folgendes ist das Code-Snippet dafür. :

public void createZipFile(string zipPath, string archiveFileName) 
{ 
    string DirectoryToBeArchive = zipPath + "\\" + archiveFileName; 

    if (Directory.Exists(DirectoryToBeArchive + ".zip")) 
    { 
     File.Delete(DirectoryToBeArchive); 
     ZipFile.CreateFromDirectory(zipPath, DirectoryToBeArchive + ".zip", CompressionLevel.Fastest, false); 
    } 
    else 
     ZipFile.CreateFromDirectory(zipPath, DirectoryToBeArchive + ".zip", CompressionLevel.Fastest, false); 

    Directory.Delete(DirectoryToBeArchive); 
} 

Hilfe würde viel geschätzt werden. Danke im Voraus. :)

+0

Mögliches Duplikat [C# ZipFile.CreateFromDirectory gearbeitet - der Prozess zugreifen kann Pfad nicht die Datei“\ _to \ _the \ _zip \ _file \ _created. zip "weil es von einem anderen Prozess verwendet wird" (http://stackoverflow.com/questions/19395128/c-sharp-zipfile-createfromdirectory-the-process-cannot-access-the-file-path-t) –

+0

Und Sehen Sie sich 'Path.Combine' und' Path.ChangeExtension' an. –

+0

Sie versuchen, ein Verzeichnis zu archivieren und die Zip-Datei in das Verzeichnis zu legen, das Sie archivieren. Natürlich erhalten Sie diesen Fehler, ändern Sie den Pfad der Zip-Datei in ein anderes Verzeichnis –

Antwort

1

Es macht nur Sinn, Sie erhalten diese Ausnahme. Lassen Sie uns Schritt für Schritt Ihren Code untersuchen:

createZipFile("C:\\Temp", "myZipFile"); 

public void createZipFile(string zipPath, string archiveFileName) 
{ 
    //DirectoryToBeArchive = "C:\\Temp\\myZipFile" 
    string DirectoryToBeArchive = zipPath + "\\" + archiveFileName; 

    //Some logical error here, you probably meant to use File.Exists() 
    //Basically, as you can't find a directory with name C:\\Temp\\myZipFile.zip, you always jump into else 
    if (Directory.Exists(DirectoryToBeArchive + ".zip")) 
    { 
     File.Delete(DirectoryToBeArchive); 
     ZipFile.CreateFromDirectory(zipPath, DirectoryToBeArchive + ".zip", CompressionLevel.Fastest, false); 
    } 
    else 
     //It will try to overwrite your existing "DirectoryToBeArchive".zip file 
     ZipFile.CreateFromDirectory(zipPath, DirectoryToBeArchive + ".zip", CompressionLevel.Fastest, false); 

    //This won't work as well btw, as there probably is no directory 
    //with name C:\\Temp\\myZipFile 
    Directory.Delete(DirectoryToBeArchive); 
} 

Obwohl, selbst wenn Sie die Datei löschen, werden Sie wahrscheinlich den gleichen Fehler treffen. Die Sache ist, wenn Sie versuchen, den Ordner in die Datei C:\\Temp\\myZipFile.zip zu zippen versuchen Sie auch, die Datei selbst zu zippen. Das ist tatsächlich, wo Sie die Datei erhalten, wird Fehler verwendet.

So

  1. ersetzen Directory.Exists() mit File.Exists()

  2. Zip in einen anderen Ordner

  3. Gerade eine freundliche Warnung, würde ich vorsichtig sein mit Directory.Delete(), wenn ich Sie wäre :)

+0

* Ich wäre vorsichtig mit Directory.Delete() * Sie sprechen aus der Erfahrung von nur Hörensagen? – rene

+0

Aus Erfahrung. Außerdem versucht er wahrscheinlich, den Ordner zu löschen, in dem sich die eigentliche Zip-Datei befindet, zusammen mit allen anderen Dateien, die er zippen will :) Am Ende wird er nichts in der Hand haben – uTeisT

+0

Nun, ich werde die gezippte Datei an haben das Ende. halten Ordner und die Zip-Datei macht keinen Sinn. Wenn ich in Zukunft die Daten brauchen würde, entziehe ich einfach die Zip-Datei. :) – Haider

0

korrekter Code:

dieses Stück Code nach kleiner Korrektur für mich ..

string DirectoryToBeArchive = zipPath + "\\" + archiveFileName; 

      if (File.Exists(DirectoryToBeArchive + ".zip")) 
      { 
       File.Delete(DirectoryToBeArchive + ".zip"); 
       ZipFile.CreateFromDirectory(DirectoryToBeArchive, DirectoryToBeArchive + ".zip", CompressionLevel.Fastest, false); 
      } 
      else 
       ZipFile.CreateFromDirectory(DirectoryToBeArchive, DirectoryToBeArchive + ".zip", CompressionLevel.Fastest, false); 

      Directory.Delete(DirectoryToBeArchive , true);