Дождитесь окончания редактирования файла

У меня следующая задача. Необходимо дождаться окончания редактирования файлов 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 Office. OpenOffice использует один процесс для открытия множественных файлов, как и MS Office. Но с OpenOffice Writer есть некоторые проблемы: функция FileIsBusy возвращает false сразу после первого сохранения файла OpenOffice Writer. Есть предложения?

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

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

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

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


person Semyon.Khmelev    schedule 10.12.2010    source источник


Ответы (1)


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

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

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

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

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

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

--jeroen

person Jeroen Wiert Pluimers    schedule 10.12.2010
comment
Я использую ProcessMonitor. OpenOffice блокирует файл до первого сохранения. - person Semyon.Khmelev; 10.12.2010