2010-12-10 9 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; 

이 접근 좋은 일을 마이크로 소프트 워드가 아니라 오픈 오피스에서 마이크로 소프트 오피스 뒤져 다음 기존의 방법을 사용하는 편집의 끝의 대기 할 필요가있다. 오픈 오피스 (OpenOffice)는 MS 오피스와 마찬가지로 오픈 멀티 플리 티 파일을위한 하나의 프로세스를 사용합니다. 하지만 OpenOffice Writer에는 몇 가지 문제가 있습니다. FileIsBusy 함수는 OpenOffice Writer로 첫 번째 저장 파일 바로 뒤에 false를 반환합니다. 제안이 있으십니까?

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

내가 다음 해결 방법을 찾을 :

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

보존 후를 , ОО 한동안 파일을 해제하고 독점적으로 공유하십시오

답변

6

귀하의 접근 방식이 conventional approach 일 것이라는 점에 동의하지 않습니다.

폴링이 convention이 아니어야하며 last resort이어야합니다.

다른 사무실 제품군은 다양한 파일 쓰기 방법을 사용합니다.
일부 사용자는 새 파일에 쓰고 완료되면 해당 파일의 이름을 바꿉니다.
일부는 이전 파일의 이름을 바꾼 다음 파일을 씁니다.
일부는 잠금을 수행 할 수 있습니다.

오피스 제품군에서 이러한 파일을 작성하는 방법을 알아야합니다.

그 때문에 무슨 일이 일어나고 있는지 모니터링해야합니다.
윈도우는 그걸 위해 ReadDirectoryChangesW 함수를 가지고 있고, OSnews는 멋진 주소 인 A Directory Monitor Class For Delphi을 게시했습니다. ReadDirectoryChangesW을 사용하는 방법을 설명하는 멋진 MSDN FWatch example도 있습니다.

우연히도 Office 제품군이 파일을 쓰는 방법을 이해하면 ReadDirectoryChangesW 코드를 사용하여 해당 파일을 볼 수 있습니다.

- 제로

+0

저는 ProcessMonitor를 사용합니다. OpenOffice는 주 파일 저장까지 파일을 잠급니다. –

관련 문제