等待上一个功能完成

时间:2016-11-14 23:37:35

标签: c#

我正在使用网络安装程序,而且我目前正在做的事情之一是

    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->清理。

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

2 个答案:

答案 0 :(得分:1)

根据下面的提取代码

$.oc.[...]

在完成zip文件之前,您正在调用移动文件。看到移动文件方法负责调用清理功能,那么在尝试删除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循环中重复调用它。

答案 1 :(得分:1)

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

无论如何,问题是因为您在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"; } } 区域内呼叫MoveFiles()

using

将其移到使用区域之外。