我需要暂时保存并打开下载的文件。产品所有者声明的需要是不必通过文件保存对话框来检索这些文件,也不必让文件无限期地放在他们的硬盘上。
为此,我在下载这些文件时实现了“仅查看”选项。使用时,文件将使用默认文件名保存到用户的Temporary Internet Files目录中,然后使用Process.Start(fileName)
使用默认程序打开。此行为模仿我的桌面应用程序所基于的Web UI。
这是问题所在。用户希望我更进一步,当程序打开以查看文件被用户关闭时,立即删除该文件。 “没问题”,我想,并编写了以下代码:
protected static readonly ConcurrentDictionary<int, Process> OpenFileViewers
= new ConcurrentDictionary<int, Process>();
protected void LaunchFileAndWatch(string fileName, Action<string> closeFileCallback)
{
try
{
var process = Process.Start(fileName);
OpenFileViewers.TryAdd(process.Id, process);
process.WaitForExit();
OpenFileViewers.TryRemove(process.Id, out process);
closeFileCallback(fileName);
}
catch (Exception ex)
{
HandleExceptionInUIThread(ex);
}
}
protected virtual void HandleExceptionInUIThread(Exception ex)
{
if (InvokeRequired)
{
this.Invoke(new Action<Exception>(HandleExceptionInUIThread), ex);
return;
}
//TODO: Whatever we want to do with the exception; for now, throw it out to ThreadException handler
throw ex;
}
protected void DeleteFile(string fileName)
{
try
{
File.Delete(fileName);
}
catch (Exception ex)
{
HandleExceptionInUIThread(ex);
}
}
...
((Action<string, Action<string>>)LaunchFileAndWatch).BeginInvoke(downloadedFileName, DeleteFile, null, null);
ConcurrentDictionary允许我在应用程序关闭时关闭任何打开的查看器程序(如果用户愿意),这样也可以删除文件。
问题是,当Process.Start()
的调用实际上没有启动新进程时,此代码失败。我不知道会发生这种情况,但显然shell会重用现有进程,当发生这种情况时,你不会从任何版本的Process.Start
中获取进程信息,无论是静态还是实例。 / p>
在这种情况下,文件未被删除且用户不满意。
有没有办法可以使用Process.Start
打开文件,这会强制Windows让我控制进程,而不必放弃使用Windows的默认程序数据库?