Хорошо, вот сделка ...
У меня есть программа Windows (XP) в .NET 2.0 (C #), которая позволяет пользователям переименовывать данный файл .pdf. (Имя файла является «структурно описательным», так как оно выдает простую информацию о том, что находится в самом файле.) В единственной форме программы есть объект LinkLabel, который позволяет пользователю открывать сам файл .pdf, чтобы они могли видеть что они переименовывают.
Хитрость в том, что, когда пользователь вносит соответствующие изменения и нажимает кнопку «Сохранить», я хочу, чтобы окно Acrobat, показывающее .pdf, закрывалось, выполняемое сохранение, «следующий» файл извлекался и откроется новое окно для немедленно , отображающее следующий файл.
Вот соответствующие фрагменты кода:
private void OpenViewer()
{
// NOTE: pdfView is of type Process, in case you're not familiar with
// Process.Start().
pdfView = System.Diagnostics.Process.Start(lnkFile.Links[0].LinkData.ToString());
}
private bool KillViewer()
{
bool result = (pdfView != null);
if (pdfView != null)
{
pdfView.CloseMainWindow();
pdfView.Close();
pdfView.Dispose();
pdfView = null;
GC.Collect();
// Verify that the lock is available before you return, as returning basically says:
// "Yup, the file's available."
bool locked = false;
StreamWriter sw = null;
do
{
try
{
sw = new StreamWriter(new FileStream(lnkFile.Links[0].LinkData.ToString(), FileMode.Open));
locked = false;
}
catch (Exception)
{
locked = true;
}
} while (locked);
sw.Dispose();
}
return result;
}
private void SomeButtonEvent
{
// Record whether a viewer was open in the first place.
bool viewerActive = KillViewer();
PerformFileLockingMethod();
GetNextFile()
if(viewerActive)
{
OpenViewer();
}
}
Обратите внимание, что в KillViewer () в основном есть цикл захвата блокировки, чтобы убедиться, что программа не пытается переименовать рабочий файл до тех пор, пока программа просмотра PDF не снимет блокировку полностью.
Проблема заключается в следующем: иногда все это работает прекрасно, а иногда KillViewer прерывается при вызове CloseMainWindow () с исключением InvalidOperationException, details = "Процесс завершен, поэтому запрашиваемая информация недоступна". Это было бы довольно просто, если бы не две вещи ...
1: pdfView.HasExited = true
И
2: Проклятый просмотрщик PDF-файлов ЕЩЕ ОТКРЫТ !!!
Как в мире это возможно? Есть ли какая-нибудь команда процесса, которую я должен использовать, чтобы закрыть окно? К вашему сведению, программа не ссылается ни на что, кроме пространств имен System. * Или внутреннего класса, который в конечном итоге также ссылается только на System. *.
Спасибо.