Дождитесь окончания редактирования файла - PullRequest
3 голосов
/ 10 декабря 2010

У меня есть следующая задача.Необходимо дождаться окончания редактирования файлов Microsoft Office. Я использую следующий традиционный подход: файл редактируется, когда файл занят:

function FileIsBusy(AFileName: string): Boolean;
var
  F: Integer;
begin
  F := FileOpen(AFileName, fmShareExclusive);
  Result := F = -1;
  FileClose(F);
end;

function WaitFile(AFileName: string; ASpeepDelay: integer): Boolean;
begin
  while FileIsBusy(AFileName) do
    Sleep(ASpeepDelay);
  Result := True;
end;

Этот подход хорошо работает с редактированием файла Microsoft Word, а не в OpenОфис.OpenOffice использует один процесс для открытия файлов множественности, как MS Office.Но с OpenOffice Writer есть некоторые проблемы: функция FileIsBusy возвращает false сразу после первого сохранения файла OpenOffice Writer.Есть какие-нибудь предложения?

===================================

Я нашел следующее решение:

  repeat
    WaitFile(FFileInfo.lpFile, 333);
    Sleep(1000);
  until not FileIsBusy(FFileInfo.lpFile);

После сохранения ОО некоторое время выпускает файл и снова эксклюзивно делится

1 Ответ

6 голосов
/ 10 декабря 2010

Я не согласен, что ваш подход будет conventional approach.

Опрос не должен быть convention, это должен быть last resort.

В разных офисных пакетах будут использоваться разные способы записи в файлы.
Некоторые запишут в новый файл и переименуют этот файл после завершения.
Некоторые переименуют старый файл, а затем запишут файл.
Некоторые могут выполнить блокировку.

Вы должны узнать, как ваши офисные пакеты будут записывать эти файлы.

Для этого вам нужно следить за происходящим.
Для этого в Windows есть функция ReadDirectoryChangesW , а OSnews опубликовала замечательный класс монитора каталогов для Delphi , который обходит это. Есть также хороший MSDN FWatch пример , который объясняет, как использовать ReadDirectoryChangesW.

Кстати, когда вы понимаете, как какой офисный пакет записывает файлы, вы можете использовать свой код ReadDirectoryChangesW для отслеживания этих операций записи файлов.

- Йерун

...