3

次の仕事があります。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;

このアプローチは、Open Officeではなく、MicrosoftWordによるファイルの編集でうまく機能します。OpenOfficeは、MS Officeと同じように、多重度ファイルを開くために1つのプロセスを使用します。しかし、OpenOffice Writerにはいくつかの問題があります。関数FileIsBusyは、OpenOfficeWriterで最初にファイルを保存した直後にfalseを返します。何か提案はありますか?

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

私は次の解決策を見つけます:

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

保存後、ООはしばらくの間ファイルをリリースし、再び独占的に共有します

4

1 に答える 1

6

あなたのアプローチがconventional approach.

ポーリングは ではなくconvention、 である必要がありlast resortます。

オフィス スイートが異なれば、ファイルへの書き込み方法も異なります。
新しいファイルに書き込み、完了時にそのファイルの名前を変更するものもあります。
古いファイルの名前を変更してから、ファイルを書き込む人もいます。
ロックを実行するものもあります。

オフィス スイートがこれらのファイルをどのように書き込むかを確認する必要があります。

そのためには、何が起こっているかを監視する必要があります。
Windows にはそのためのReadDirectoryChangesW関数があり、OSnews はそれをラップするDelphi 用のディレクトリ モニタ クラスを公開しました。の使用方法を説明する素敵なMSDN FWatch の例ReadDirectoryChangesWもあります。

ちなみに、どのオフィス スイートがどのようにファイルを書き込むかを理解すれば、ReadDirectoryChangesWコードを使用してそれらのファイルの書き込みも監視できます。

--jeroen

于 2010-12-10T09:04:08.857 に答える