2016-08-04 2 views
0

На самом деле я пытаюсь создать zip-файл каталога, но ZipFile.CreateFromDirectory(), дающий ниже Исключение.System.IO.IOException: процесс не может получить доступ к файлу PATH_TO_CREATE_ZIP/file.zip ', потому что он используется другим процессом.

System.IO.IOException: Процесс не может получить доступ к файлу PATH_TO_CREATE_ZIP/file.zip», так как он используется другим процессом .

Ниже приведен фрагмент кода. :

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); 
} 

Помощь была бы очень оценена. Заранее спасибо. :)

+0

Возможный дубликат [с # ZipFile.CreateFromDirectory - процесс не может получить доступ к файлу»\ _to \ _The \ _zip \ _file \ _created. zip ", потому что он используется другим процессом] (http://stackoverflow.com/questions/19395128/c-sharp-zipfile-createfromdirectory-the-process-cannot-access-the-file-path-t) –

+0

И загляните в «Path.Combine» и «Path.ChangeExtension» –

+0

. Вы пытаетесь архивировать каталог и поместить zip в тот же каталог, который вы архивируете. Конечно, вы получите эту ошибку, измените путь к zip-файлу в другой каталог. –

ответ

1

Имеет смысл только исключение. Давайте исследуем ваш шаг за шагом код:

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); 
} 

Хотя, даже если вы удалите файл, вы, вероятно, ударил же ошибку. Дело в том, что при попытке разархивировать папку C:\\Temp в файл C:\\Temp\\myZipFile.zip вы также попытаетесь выполнить zip-файл. На самом деле, где вы получаете файл, используется ошибка.

Так,

  1. Заменить Directory.Exists() с File.Exists()

  2. Zip в другой папке

  3. Просто дружеское предупреждение, я бы быть осторожным с Directory.Delete(), если бы я был вами :)

+0

* Я был бы осторожен с Directory.Delete() * Вы говорите из опыта только понаслышке? – rene

+0

Неожиданность. Кроме того, он, вероятно, пытается удалить папку, в которой находится фактический zip-файл, а также все другие файлы, которые он пытается заархивировать :) Так что, в конце концов, у него ничего не будет в руках – uTeisT

+0

Ну, у меня будет застежка-молния на конец. Сохранение как папки, так и zip-файла не имеет смысла. в будущем, если бы мне нужны данные, я просто извлечу почтовый индекс. :) – Haider

0

Исправить код:

этот кусок кода после того, как немного коррекции работал для меня ..

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); 
Смежные вопросы

 Смежные вопросы