Delphi 2010 - 文件正在使用中吗?

Delphi 2010 - Is File in Use?

我有一个功能可以正常工作,可以检查是否正在使用本地文件。 但是,如果我映射网络驱动器并尝试检查映射驱动器中的文件是否正在使用,则该函数的结果始终为 false。 我需要等待一个大文件被复制到映射的驱动器,完成后我重命名文件。 如果该文件未被使用,那么我将开始执行各种操作,否则我会再等一分钟并再次检查。 我如何修改下面的函数以处理不断复制的映射驱动器文件?

谢谢

function IsFileInUse(FileName: TFileName): Boolean;
var
  HFileRes: HFILE;
begin
  Result := False;
  if not FileExists(FileName) then
  begin
  showmessage('Fisierul "'+Filename+'" nu exista!');
  Exit;
  end
  else
  begin
  HFileRes := CreateFile(PChar(FileName),
                         GENERIC_READ or GENERIC_WRITE,
                         0,
                         nil,
                         OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL,
                         0);
  Result := (HFileRes = INVALID_HANDLE_VALUE);
  if not Result then
    CloseHandle(HFileRes);
  end;
end;

您声称的是 CreateFile 在另一方写入文件时成功地以独占模式打开文件。可能的解释:

  1. 您输入的文件名有误,您打开的不是正在使用的文件。
  2. 对方正在写入文件,但没有锁定。换句话说,它以允许其他方读写的共享模式打开文件。这很不寻常。如果是这种情况,那么您需要修复其他进程。
  3. 远程文件服务器已损坏,无法遵守锁。我认为这不太可能。

我觉得最后的选项可以马上否决。选项 2 似乎不太可能。留下选项 1。您可以锁定文件,因为它没有被锁定。

我还要评论说这个函数是虚假的。您可以将其删除。只需尝试您需要执行的任何操作。如果该操作由于共享冲突而失败,您就知道该文件已被锁定。还要考虑使用该函数的任何代码中的竞争条件。文件现在已解锁的事实并不能阻止另一方在您可以对其进行任何操作之前锁定该文件。