0

我的数据库中有一个存储各种文件的表。

文件名显示在 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();
4

2 回答 2

1

当您首先关闭 MessageBox 时,临时文件不会被删除,因为 WPV 使用它并且不允许它。

于 2013-06-21T13:06:54.267 回答
0

根据这个 MSDN:http: //msdn.microsoft.com/en-us/library/53ezey2s.aspx

...当进程已经运行时,您将无法取回对象。Process

我在一个与 WindowsPhotoViewer 的性质有关的论坛上发现了这个:

实际上,Windows Photo Viewer 是 Windows Explorer 的一部分,一般运行在 Explorer.exe 进程中。实际上,您所称的照片查看器实际上只是图像的“预览”动词。它不是一个独立的应用程序,在没有图像的情况下打开它并没有任何意义。

因此,您不会取回一个Process对象,因为它已经在运行,因为它已经explorer.exe在运行。

最后,我认为这意味着如果您的图像在 WindowsPhotoViewer 中打开,您将无法工作WaitForExit(),因为所有者进程永远不会退出。

于 2013-06-21T13:27:55.263 回答