如何检查是否已加载.exe文件以执行该文件?

时间:2018-07-20 17:50:36

标签: c# exe

这可能是一个新手问题。我正在从服务器加载可执行文件,然后要执行此程序。执行完成后,我要删除此文件。

这是我的代码的一部分:

 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                if (check == true)
                {
                    if (webBrowser1.DocumentText.Contains("0"))
                    {
                        check = false;
                        // timer1.Stop();
                        button1.Enabled = true;
                        MessageBox.Show("Wrong HWID ");
                        this.Close();
                    }
        else if (webBrowser1.DocumentText.Contains("1"))
        {
            check = false;
            // timer1.Stop();
            button1.Enabled = true;
            WebClient wc = new WebClient();
            Properties.Settings.Default.Serial = textBox1.Text;
            Properties.Settings.Default.Installed = true;
            Properties.Settings.Default.Save();
            MessageBox.Show("All info correct!");
            var result = MessageBox.Show("Do you want to start ?", "Application Exit", MessageBoxButtons.YesNo);
            if (result == DialogResult.Yes)
            {
                wc.DownloadFileAsync(uri, filename);
            }



            if (File.Exists(filename))
            {
                Process.Start(filename);
            }
        }
 else if (webBrowser1.DocumentText.Contains("2"))
                {
                    check = false;
                    // timer1.Stop();
                    button1.Enabled = true;
                    MessageBox.Show("HWID field left empty");
                }
                else if (webBrowser1.DocumentText.Contains("3"))
                {
                    check = false;
                    // timer1.Stop();
                    button1.Enabled = true;
                    MessageBox.Show("Wrong serial");

                }
                else if (webBrowser1.DocumentText.Contains("Object not found"))

其他相关代码:

Uri uri = new Uri("http://link.com/blabla/blabla.exe");
string filename = @"C:\Users\User\blabla.exe";

1 个答案:

答案 0 :(得分:1)

如果可以锁定当前进程,可以同步进行。这不是推荐的方法,但是根据您的环境可能会起作用。

更改此:

wc.DownloadFileAsync(uri, filename);

对此:

wc.DownloadFile(uri, filename);

在此之后,您可以添加:

if (File.Exists(filename)) {
    Process process = Process.Start(filename);
    process.WaitForExit();

    File.Delete(filename);
}

这将检查文件是否存在,启动它,等待它完成,然后将其删除。与使用FileIO一样,您应该一如既往地处理异常。


这是更好的方法

如果需要设置为async,那么另一种方法可能是下载完成后触发事件。您可能想在WebClient中添加如下事件处理程序:

client.DownloadFileCompleted += new AsyncCompletedEventHandler (DownloadFileCallback);

然后添加类似于以下内容的处理程序方法:

private void DownloadFileCallback(object sender, AsyncCompletedEventArgs e)  {
    if (File.Exists(filename)) {
        Process process = Process.Start(filename);
        process.WaitForExit();
    }
}

请注意,在此处理程序方法中,filename是类的实例数据,因此您知道文件的保存位置。这应该使您朝正确的方向开始。

编辑:

如我的回答所述,使用wc.DownloadFile()是同步的,这意味着它将锁定您当前的进程。 (即,调试时,您会在跳过此行时看到此内容,直到完成该操作之后,它才能执行其他操作)。当下载(或更通常是任何同步过程)花费很长时间时,这可能会导致问题,它有可能锁定您的UI(如果这是UI代码)。最佳实践是异步执行此操作,这就是您发布的原始代码的作用。在您发布的代码中,您正在使用wc.DownloadFileAsync()。为了继续使用此方法,请添加一个如上所述的事件处理程序,下载完成后将调用此处理程序方法。这使得下载在后台运行,因此您的线程可以在运行时自由运行其他内容。 (即,这可能会使您的UI在长时间下载时保持响应)。在事件处理程序中,下载已完成,因此您可以从那里继续。

编辑2:

由于只执行程序然后将其删除,因此仅将其保存到temp目录(导航至%temp%)可能是值得的。可能会产生以下结果的filename

string filename = Path.Combine(Path.GetTempPath(), "MyFile.exe");

这应该导致类似以下路径C:\Users\Username\AppData\Local\Temp\MyFile.exe