我有一个应用程序(winforms),将文件下载到用户的临时文件夹,然后打开文件供用户查看内容,当文件closures时,文件将从临时文件夹中删除。 应用程序工作正常,如果我打开让我们说一个.pdf和一个.doc当尝试打开一个.doc时,如果另一个双字过程仍在运行(如果是由我的应用程序打开或直接由用户无关紧要,无所谓) 。
我使用下面的代码:
_OpenFileProces = System.Diagnostics.Process.Start(TempFileName); _OpenFileProces.EnableRaisingEvents = true; _OpenFileProces.Exited += new EventHandler(_OpenFileProces_Exited);
这一个清除温度
void _OpenFileProces_Exited(object sender, EventArgs e) { string s = ((System.Diagnostics.Process)sender).StartInfo.FileName; System.IO.File.Delete(s); }
似乎正在运行的进程正在停止我自己的..并由于停止它将删除该文件或它会在尝试删除文件时产生错误。
你有什么build议,我怎么能打开我自己的过程? 事情是我不知道我必须打开什么文件types(可能是任何东西),我指望Windowsselect最好的应用程序。 从我的testing中,记事本工作正常,但winword和杂技演员closures我的过程。
谢谢
我怀疑Microsoft Word在这里做的和Raymond Chen描述的Windows Shell完全一样:
一位客户想要监控浏览器窗口的生命周期。
“ 我们希望启动一个资源管理器的副本来打开一个特定的文件夹,然后等待用户关闭文件夹,然后再继续。我们尝试在命令行上启动一个资源管理器的副本,然后在进程句柄上执行WaitForSingleObject,但等待有时会立即完成,我们如何等待用户关闭浏览器窗口?
这是另一个半途而废的问题,另一个半途而废。
WaitForSingleObject
立即返回的原因是Explorer是一个单实例程序(很好,有限实例)。 当您打开资源管理器窗口时,请求将被移交给运行的资源管理器,并且您启动的资源管理器的副本将退出。 这就是你的WaitForSingleObject
立即返回的原因。
在你的情况下,Word已经在运行了,所以当你创建第二个 Word进程并指示它打开你的文档时,它只是简单地将请求交给已经运行的Word实例,然后退出你立即启动的第二个进程。
当你描述“正在运行的过程正在阻止我自己”时,这就是你所看到的。 因为第二个实例在启动后会立即关闭,所以会引发Exited
事件,并且您的代码会通知它删除该文件!
你敏锐地观察记事本(不像Word和Adobe Acrobat)工作得很好。 这是因为记事本被设计成一个多实例应用程序。 您可以根据需要打开任意数量的记事本副本。 它不关心在桌面上是否已经打开了1或6个副本。 更重要的是,要求shell在记事本中打开文本文档实际上会打开记事本应用程序的第二个副本,而不是向第一个实例发送请求,为新文档打开一个新窗口。
你应该像这样设置Process.StartInfo.UseShellExecute为true
_OpenFileProces.StartInfo.UseShellExecute = true;
之前开始的过程,然后它应该工作,我认为…