2010-12-10 89 views
3

我有下一個任務。這是需要等待的編輯月底的Microsoft Office files.I下次使用傳統的方法:文件編輯雖然文件是忙:等到文件編輯結束

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,而不是開放式辦公。 OpenOffice使用一個進程來開放多重文件,就像MS Office一樣。但是用OpenOffice Writer有一些問題:函數FileIsBusy在第一個由OpenOffice Writer保存文件之後返回false。有什麼建議嗎?

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

我找到一個解決方案:

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

保存後,ОО發佈文件一段時間再次獨家分享

回答

6

我不同意你的方法是conventional approach

投票不應該是convention,它應該是last resort

不同的辦公套件將使用不同的寫入文件的方式。
有些人會寫入新文件,完成後重命名該文件。
有些會重命名舊文件,然後寫入文件。
有些人可能會執行鎖定。

您應該瞭解您的辦公套件如何編寫這些文件。

爲此,您需要監視發生了什麼。
Windows對此具有ReadDirectoryChangesW功能,OSnews發佈了一個很好的A Directory Monitor Class For Delphi,其中包含了該功能。還有一個不錯的MSDN FWatch example,解釋如何使用ReadDirectoryChangesW

當然,當你瞭解哪個辦公套件寫入文件時,你可以使用你的ReadDirectoryChangesW代碼來監視那些文件寫入。

- jeroen

+0

我使用ProcessMonitor。 OpenOffice鎖定文件直到保存爲止。 – 2010-12-10 09:55:05