我的数据库中有一个存储所有类型文件的表。
文件名显示在ListView中,当用户查看其中一个文件名时,注册的应用程序会根据文件扩展名打开它。
这是代码:
if (listViewArchivos.HasItems)
{
dynamic result = listViewArchivos.SelectedItem;
var nombre = Path.GetTempPath() + admin.buscarNombreArchivo((int)result.Id);
var bytes = admin.buscarArchivo((int)result.Id);
try
{
using (var writer = new BinaryWriter(File.Open(nombre, FileMode.Create)))
{
writer.Write(bytes);
}
var p = Process.Start(nombre);
p.WaitForExit();
}
catch (Exception exc)
{
InterfazUtil.error(exc.Message); // This shows a MessageBox
}
finally
{
File.Delete(nombre);
}
}
它适用于docx,pdf,txt等。但是当我尝试打开图像时,Window Photo Viewer(Windows 7)成功打开了该文件,但抛出了NullReferenceException。
如果先关闭WPV,然后关闭MessageBox,则会从临时文件夹中删除该文件。
如果我先关闭MessageBox,那么图像会从WPV中消失,关闭WPV后,文件不会从临时文件夹中删除。
现在,如果我删除catch块,则WPV成功打开文件,关闭后文件不会从临时文件夹中删除。显然,应用程序崩溃是因为不管理异常。
看起来问题是WPV。
知道什么是错的?
TIA
编辑:
抛出异常
p.WaitForExit();
答案 0 :(得分:1)
首先关闭MessageBox时,临时文件不会被删除,因为WPV使用它并且不允许它。
答案 1 :(得分:0)
根据此MSDN:http://msdn.microsoft.com/en-us/library/53ezey2s.aspx
...当进程已经运行时,你将不取回Process
对象。
我在一个与WindowsPhotoViewer性质相关的论坛上发现了这个:
实际上,Windows Photo Viewer是Windows资源管理器的一部分,而且 通常在Explorer.exe进程中运行。事实上,你是什么 调用照片查看器实际上只是图像的“预览”动词。 它不是一个独立的应用程序,并且没有图像或打开它 图像实际上没有任何意义。
因此,由于已经在运行,因为Process
已经在运行,所以你没有找回explorer.exe
对象。
最后,我认为这意味着如果您的图片在WindowsPhotoViewer中打开,您将 无法使WaitForExit()
工作,因为所有者进程永远不会退出。