0

データベースに、あらゆる種類のファイルを格納するテーブルがあります。

ファイル名は ListView に表示され、ユーザーがそのうちの 1 つをクリックすると、ファイル拡張子に基づいて登録されたアプリケーションによって開かれます。

これはコードです:

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 のようです。

何が悪いのか考えていますか?

ティア

編集:

例外がスローされます

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 フォト ビューアーは Windows エクスプローラーの一部であり、通常は Explorer.exe プロセスで実行されます。実際、あなたがフォト ビューアーと呼んでいるものは、実際には画像の "プレビュー" 動詞にすぎません。これはスタンドアロン アプリケーションではなく、画像なしで開いても意味がありません。

したがって、すでに実行されているという事実のために、オブジェクトはすでに実行Processされているため、オブジェクトを取り戻すことはできません。explorer.exe

結局のところ、WindowsPhotoViewer で画像を開いた場合、所有者プロセスが終了しないため、作業を行うことができないということだと思います。WaitForExit()

于 2013-06-21T13:27:55.263 に答える