2016-11-14 82 views
0

我工作的一个Web安装程序和的事情,我有一个目前等待上一次函数来完成

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,因为它被另一个进程 所使用。

完整代码运行

下载 - >提取物 - > MOVE->清理。

我不确定正在使用哪个进程,但我正在寻找一种方法让每个进程在开始之前等待前一个进程完成。

+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文件之前,您所呼叫的移动文件提取码。看到移动文件方法负责调用清理功能,那么您应该确保该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

谢谢,甚至没有注意到我在使用块中。 (我注意到之前的foreach并已修复它,但也要感谢您指出它) –

1

您粘贴在pastebin上的代码与您在此处发布的代码不同。 pastebin中的代码永远不会调用清理。

反正这个问题是因为你从这里using块内调用MoveFiles()

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

移动它的使用外块。