2010-12-10 48 views
3

J'ai la tâche suivante. Il est nécessaire d'attendre la fin de l'édition Microsoft Office files.I utiliser la prochaine approche classique: fichier est le fichier vidéo tout est occupé:Attendez jusqu'à ce que l'édition d'un fichier se termine

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; 

Cette approche du bon travail avec le fichier d'édition par Microsoft Word, pas dans Open Office. OpenOffice utilise un processus pour les fichiers à multiplicité ouverte, tout comme MS Office. Mais avec OpenOffice Writer ont quelques problèmes: fonction FileIsBusy retourne false juste après premier fichier d'enregistrement par OpenOffice Writer. Avez-vous des suggestions?

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

Je trouve la solution suivante:

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

Après conservation , ОО libère un fichier pour un certain temps et encore exclusivement partager

Répondre

6

Je ne suis pas d'accord que votre approche serait le conventional approach.

L'interrogation ne doit pas être convention, elle doit être last resort.

Différentes suites bureautiques utiliseront différentes façons d'écrire dans les fichiers.
Certains vont écrire dans un nouveau fichier et renommer ce fichier à la fin.
Certains renommeront l'ancien fichier, puis écriront le fichier.
Certains peuvent effectuer un verrouillage.

Vous devriez savoir comment vos suites bureautiques vont écrire ces fichiers.

Pour cela, vous devez surveiller ce qui se passe.
Windows a la fonction ReadDirectoryChangesW pour cela, et OSnews a publié un joli A Directory Monitor Class For Delphi qui l'entoure. Il y a aussi un bon MSDN FWatch example qui explique comment utiliser ReadDirectoryChangesW. Incidemment, quand vous comprenez comment une suite bureautique écrit les fichiers, vous pouvez utiliser votre code ReadDirectoryChangesW pour surveiller ces écritures de fichiers.

--jeroen

+0

J'utilise ProcessMonitor. OpenOffice verrouille le fichier jusqu'à la première sauvegarde. –