Вопрос


У меня есть приложение (winforms), которое загружает файл во временную папку пользователя, затем открывает файл, чтобы пользователь мог просмотреть содержимое, и когда файл закрывается, файл удаляется из временной папки.Приложение работает нормально, если я открываю, скажем, one .pdf и one .doc, Проблема возникает при попытке открыть one .doc, если другой процесс winword все еще запущен (не имеет значения, открывается ли он моим приложением или непосредственно пользователем).

Я использую следующий код:

_OpenFileProces = System.Diagnostics.Process.Start(TempFileName);
_OpenFileProces.EnableRaisingEvents = true;
_OpenFileProces.Exited += new EventHandler(_OpenFileProces_Exited);

и этот , чтобы очистить темп

void _OpenFileProces_Exited(object sender, EventArgs e)
    {
        string s = ((System.Diagnostics.Process)sender).StartInfo.FileName;
        System.IO.File.Delete(s);
    }

Кажется, что запущенный процесс останавливает мой собственный..и из-за остановки он удалит файл или выдаст ошибку при попытке удалить файл.
У вас есть какие-либо предложения, как я могу открыть свой собственный процесс?Дело в том, что я не знаю, какой тип файла я должен открыть (это может быть что угодно), и я рассчитываю, что Windows выберет лучшее приложение.судя по моему тесту, notepad работает нормально, но winword и acrobat закрывают мой процесс.
Спасибо

Это было полезно?

Решение

Я подозреваю, что Microsoft Word делает здесь точно то же самое, что Рэймонд Чен описывает как это делает оболочка Windows здесь:

Клиент хотел получить помощь в мониторинге срока службы окна Проводника.

"Мы хотим запустить копию Проводника, чтобы открыть определенную папку, затем дождаться, пока пользователь закроет папку, прежде чем продолжить.Мы попытались запустить копию Explorer с папкой в командной строке, затем выполнить WaitForSingleObject в дескрипторе процесса, но ожидание иногда завершается немедленно, без ожидания.Как нам дождаться, пока пользователь закроет окно Проводника?"

Это еще один случай, когда вы решаете проблему наполовину, а затем испытываете проблемы с другой половиной.

Причина , по которой Wait­For­Single­Object сразу же возвращается то, что Explorer - это программа с одним экземпляром (ну, с ограниченным экземпляром).Когда вы открываете окно Проводника, запрос передается запущенной копии Проводника, и запущенная вами копия Проводника завершает работу.Вот почему ваш Wait­For­Single­Object возвращается немедленно.

В вашем случае Word уже запущен, поэтому, когда вы создаете второй Обработайте Word и проинструктируйте его открыть ваш документ, он просто отправит запрос экземпляру Word, который уже запущен, и немедленно завершит второй процесс, который вы запустили.

Это то, что вы видите, когда описываете, что "запущенный процесс останавливает мой собственный".Поскольку этот второй экземпляр закрывается сразу после того, как вы его запускаете, Exited вызывается событие, и ваш код сообщает ему удалить файл!

Вы проницательно заметили, что Notepad (в отличие от Word и Adobe Acrobat) работает просто отлично.Это потому, что Notepad разработан как приложение с несколькими экземплярами.Вы можете открыть столько копий Notepad, сколько захотите;неважно, открыта ли уже 1 или 6 копий на рабочем столе.И что еще более важно, запрос командной оболочки открыть текстовый документ в Блокноте фактически открывает второй копирование приложения Notepad, вместо отправки запроса в Первый например, чтобы открыть новое окно для нового документа.

Другие советы

Вы должны установить процесс. true как это _OpenFileProces.StartInfo.UseShellExecute = true; Перед началом процесса, а затем он должен работать, я думаю ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top