Автоматизация MSWord: получение содержимого файла после его сохранения - PullRequest
1 голос
/ 17 марта 2010

У меня есть приложение, которое использует MSWord для редактирования некоторых документов, после того, как они сохраняют и закрывают слово Мне нужно взять измененный файл и поместить его обратно в хранилище, там это только один сценарий, где я не могу заставить его работать, и это когда пользователь вносит изменения в файл, выбирает закрыть слово и выбирает да, чтобы сохранить файл

есть 2 события, которые я использую: DocumentBeforeSave Выход

в событии Quit. Я пытаюсь загрузить файл .docx с диска, но в этом конкретном сценарии я получаю IOException, поскольку файл все еще используется, так или иначе, мне нужно подождать, пока обработается событие Quit, когда Word фактически закрывается, а файл больше не используется

сейчас у меня это работает, используя этот

      word.Visible = true; 
        while (!wordDone) { //gets changed to true on the Quit event
            System.Threading.Thread.Sleep(100);
        }
        bool error = false;
        do {
            try { //need to load the contents of the modified file
                ls.Content = System.IO.File.ReadAllBytes(provider.GetFileName());
                error = false;
            }
            catch (System.IO.IOException) {
                error = true;
                System.Threading.Thread.Sleep(200);
            }
        } while (error);

, хотя это работает, это очень уродливо, мне нужен способ вызвать событие после обработки события Quit, или заблокировать текущий поток, пока слово еще работает, или получить событие после сохранения документа, нижняя строка Мне нужен чистый способ загрузить файл после того, как он был сохранен и слово закрыто . DocumentAfterSave было бы здорово, но, кажется, не существует.

Я также попытался отцепить обработчик Quit и вызвать word.Quit в обработчике Quit, который не имел значения

Я также исследую использование ManualResetEvent или связанных с ним классов, пока он почти работает, но мне все еще нужно сделать паузу после того, как ему было сообщено, чтобы убедиться, что слово закрыто и файл больше не используется

Ответы [ 2 ]

2 голосов
/ 17 марта 2010

Я сталкивался с подобной проблемой и в прошлом. Я не думаю, что есть какой-то хороший чистый способ, но вместо того, чтобы делать это, как описано выше, как насчет этого (подойдет, если у вас контролируемая среда)

  • Создать приложение для слова
  • Получите ID процесса немедленно, используя GetProcesses, соответствующий Winword, и последним в списке возврата должен быть тот, который вы ищете. Это не на 100% надежно в многопользовательской среде.
  • После выхода из слова используйте цикл Thread.Sleep, чтобы PID больше не существовал.
  • Чтение документов для ваших пользовательских операций
1 голос
/ 17 марта 2010

Раньше у меня была такая же проблема. Использование ReleaseComObject для всех объектов, связанных с COM, добилось цели (то есть для вашего объекта Word и вашего объекта Word.Application). Таким образом вы гарантируете, что все грязные блокировки будут удалены после уничтожения COM-объекта. Закройте документ и приложение с помощью Interop API. Я использую:

   var localWordapp = new Word.Application();
   localWordapp.Visible = false;
   Word.Document doc = null;
   // ...
    if (doc != null)
    {
      doc.Close();
      System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
    }
    localWordapp.Quit();
    System.Runtime.InteropServices.Marshal.ReleaseComObject(localWordapp);
...