这可能是一个新手问题。我正在从服务器加载可执行文件,然后要执行此程序。执行完成后,我要删除此文件。
这是我的代码的一部分:
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";
答案 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