我正在编写一个在目录中启动随机文件的程序。该文件可以是任何时间,但主要是视频或图像文件。 每次我启动一个文件,我想关闭以前打开的文件。 代码是:
string FolderSelected = "";
string FileName = "";
Process proc;
List<string> FilesDisplayed = new List<string>();
public Form1()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
if (FolderSelected == string.Empty)
FolderSelected = Properties.Settings.Default.FilesDefaultFolder;
if (proc != null)
{
proc.CloseMainWindow();
proc.Close();
}
FileName = FetchRandomFile();
proc = Process.Start(FileName);
}
问题是,我一直得到proc = null(文件正确启动),我无法获取以前打开的进程以关闭它。我知道.NET重用进程,这就是为什么它返回Null但我需要覆盖这种行为。 请帮忙, 盖
答案 0 :(得分:14)
我用这个简单的测试应用程序重现了这个:
using System;
using System.Diagnostics;
public class Test
{
static void Main()
{
Process proc = Process.Start("image.tif");
Console.WriteLine(proc == null);
}
}
这会打印“true”,因为它使用dllhost.exe
来托管Windows Image Viewer,而不是创建新进程。
答案 1 :(得分:0)
甚至不会编译(明确赋值)。作为方法变量,proc
仅对于声明方法(/ scope)是本地的 - 即button2_Click
,这解释了为什么不能保留值。如果要在调用之间保持proc
,请将其提升为字段(每个实例变量):
Process proc;
private void button2_Click(object sender, EventArgs e)
{
if (proc != null)
...
答案 2 :(得分:0)
要解决此问题,您必须将UseShellExecute
设置为false以绕过shell。
而不是
Process.Start("filename", "args")`
使用
Process.Start(new ProcessStartInfo() {
Filename = "filename",
Arguments = "args",
UseShellExecute = false
}
答案 3 :(得分:-1)
您在方法范围内声明'proc',因此当在该方法的顶部检查时,总是为空。如果您希望引用超出函数的范围,请声明它是类级变量。
每次(可能)都会生成一个进程,Process.Start不会返回null,但是当我超出范围时,你只是丢失对它的引用。
答案 4 :(得分:-1)
如果出于安全原因或出于某种原因(例如我的情况),您迫切需要启动文件的过程的引用,则必须创建自己的过程
Process process = new Process();
process.StartInfo= new ProcessStartInfo(filename);
process.Start();
process.Disposed+= (s, e) => System.IO.File.Delete(filename);
// and if you want to manually end the process you
//could just use
process.Dispose();
如果您自行处理或自动处理,则文件将被删除... 当然,不要忘记在可以达到的级别范围内标识您的流程