2016-11-14 8 views
0

Я работаю на веб-инсталлятор и одна из вещей, которые я имею в настоящее время являетсяПодождите предыдущая функция для завершения

void MoveFiles() 
    { 
     lbldlstatus.Text = "Moving Files"; 
     string InstallDirectory = Directory.GetCurrentDirectory() + "/DoxramosRepack-master"; 
     DirectoryInfo d = new DirectoryInfo(InstallDirectory); 
     foreach(var file in d.GetFiles("*")) 
     { 
      try 
      { 
       if (File.Exists(file.Name)) { 
       File.Delete(file.Name); 
      } 

       Directory.Move(file.FullName, file.Name); 
       Cleanup(); 
      } 
      catch(Exception e) 
      { 
       MessageBox.Show(e.ToString()); 
       lbldlstatus.Text = "Repack Installation Failed"; 
      } 
     }    
    } 
    void Cleanup() 
    { 
     lbldlstatus.Text = "Cleaning Up Files"; 
     try 
     { 
      if (File.Exists("Repack.zip")) 
      { 
       File.Delete("Repack.zip"); 
      } 
      if(Directory.Exists("DoxramosRepack-master")) 
      { 
       Directory.Delete("DoxramosRepack-master"); 
      } 
      lbldlstatus.Text = "Repack Installed Successfully"; 
     } 

Когда я получаю Cleanup() у меня есть System.IO.IOException.

Процесс не может получить доступ к файлу Repack.zip, поскольку он используется другим процессом.

Полный код работает

Download-> Extract-> MOVE-> Cleanup.

Я не уверен, какой процесс используется, но я ищу, чтобы найти способ для каждого процесса дождаться завершения предыдущего перед запуском.

+0

Я не думаю, что вы используете методы асинхронизации в любом месте, поэтому, вероятно, вы не закрываете файл правильно. –

+1

Код для извлечения, вероятно, не закрывается или не утилизируется должным образом, поэтому при попытке удалить zip-файл все еще используется. Учитывая, что код извлечения не показан, он не может быть подтвержден, если это так. – Nkosi

+0

Когда я вернусь на свой компьютер, я брошу свою загрузку, извлечение и перемещение по вставке после того, как прочитаю, если это не проблема. Спасибо, ребята –

ответ

1

Согласно экстракту ниже код

void Extract() 
{ 
    string zipPath = @"Repack.zip"; 
    string extractPath = @"."; 
    try 
    { 
     using (ZipFile unzip = ZipFile.Read(zipPath)) 
     { 
      unzip.ExtractAll(extractPath); 
      lbldlstatus.Text = "Extracting Files"; 
      MoveFiles();    
     } 
    } 
    catch (ZipException e) 
    { 
     MessageBox.Show(e.ToString()); 
     lbldlstatus.Text = "Repack Installation Failed"; 
    } 
} 

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

void Extract() 
{ 
    string zipPath = @"Repack.zip"; 
    string extractPath = @"."; 
    try 
    { 
     using (ZipFile unzip = ZipFile.Read(zipPath)) 
     { 
      unzip.ExtractAll(extractPath); 
      lbldlstatus.Text = "Extracting Files"; 
     } 
     MoveFiles(); 
    } 
    catch (ZipException e) 
    { 
     MessageBox.Show(e.ToString()); 
     lbldlstatus.Text = "Repack Installation Failed"; 
    } 
} 

Очистка также должна быть вызвана после того, как все было перемещено. В настоящее время код примера вызывает его повторно в цикле for.

+0

Спасибо, даже не заметил, что у меня было это в блоке использования. (Раньше я заметил предвестник и исправил его, но спасибо за то, что он тоже указал) –

1

Код, который вы наклеили на pastebin, отличается от того, что вы разместили здесь. Код в pastebin никогда не вызывает очистку.

В любом случае проблема в том, что вы вызываете MoveFiles() внутри using блока здесь:

using (ZipFile unzip = ZipFile.Read(zipPath)) 
{ 
    unzip.ExtractAll(extractPath); 
    lbldlstatus.Text = "Extracting Files"; 
    MoveFiles();  
} 

переместить его за пределы с помощью блока.

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