2010-12-10 11 views
3

次の作業があります。ファイル編集が終了するまで待つ

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による編集ファイルではなく、オープンオフィスではこのアプローチ良い仕事:ファイルがビジー状態ですが、ファイルが編集されています。次の従来のアプローチを使用して編集のMicrosoft Office files.Iの終了を待つ必要があります。 OpenOfficeは、MS Officeのようなオープンな多重度ファイルに対して1つのプロセスを使用します。しかし、OpenOffice Writerにはいくつかの問題があります。関数FileIsBusyは、の最初ののファイルをOpenOffice Writerで保存した直後にfalseを返します。何か提案がありますか?保存後

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

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

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

、ООしばらくの間ファイルを解放し、再び排他的に共有する

答えて

6

私はあなたのアプローチがconventional approachであることに同意しません。

ポーリングは、それがlast resortする必要があり、conventionすべきではありません。

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

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

そのためには、何が起こっているのかを監視する必要があります。
WindowsはそのためにReadDirectoryChangesW関数を持っていて、OSnewsはそれを囲む素敵なA Directory Monitor Class For Delphiを公開しました。 ReadDirectoryChangesWの使い方について説明している素敵なMSDN FWatch exampleもあります。

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

--jeroen

+0

私はProcessMonitorを使用します。 OpenOfficeはファイルを一旦保存するまでロックします。 –

関連する問題