NullReferenceException только при открытии изображений из базы данных
У меня есть таблица в моей базе данных, которая хранит все виды файлов.
Имена файлов отображаются в 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.
Есть идеи, что не так?
ТИА
РЕДАКТИРОВАТЬ:
Исключение брошено в
p.WaitForExit();
2 ответа
Согласно этому MSDN: http://msdn.microsoft.com/en-us/library/53ezey2s.aspx
... вы не получите обратно Process
объект, когда процесс уже запущен.
Я нашел это на форуме, касающемся природы WindowsPhotoViewer:
На самом деле средство просмотра фотографий Windows является частью проводника Windows и обычно выполняется в процессе Explorer.exe. На самом деле то, что вы называете Photo Viewer, на самом деле является просто глаголом "предварительного просмотра" для изображений. Это не отдельное приложение, и открывать его без изображения или изображений на самом деле не имеет никакого смысла.
Таким образом, вы не получаете обратно Process
объект, потому что он уже работает в силу того факта, что explorer.exe
уже бежит.
В конце концов, я думаю, что это означает, что если ваши изображения открываются в WindowsPhotoViewer, вы не сможете сделать WaitForExit()
работать, потому что процесс владельца никогда не завершится.
Когда вы сначала закрываете MessageBox, временный файл не удаляется, потому что WPV использует его и не разрешает.