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;

这种方法适用于通过 Microsoft Word 编辑文件,而不是在 Open Office 中。OpenOffice 使用一个进程来打开多个文件,就像 MS Office 一样。但是使用 OpenOffice Writer 有一些问题:函数 FileIsBusy 在OpenOffice Writer首次保存文件后返回 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代码来监视这些文件写入。

——杰伦

于 2010-12-10T09:04:08.857 回答