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

时间:2015-02-06 10:41:43

标签: delphi delphi-2010

我有一个可以检查本地文件是否正在使用的功能。 但是,如果我映射网络驱动器并尝试检查映射驱动器中的文件是否正在使用,则该函数的结果始终为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;

1 个答案:

答案 0 :(得分:0)

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

  1. 您的文件名出错,而您正在打开的文件不是正在使用的文件。
  2. 另一方正在写入文件而未锁定它。换句话说,它以共享模式打开文件,允许其他方进行读写。这很不寻常。如果是这种情况,那么您需要修复其他进程。
  3. 远程文件服务器已损坏,无法遵守锁定。我认为这不太可能。
  4. 我认为可以立即拒绝最终选项。方案2似乎不太可能。哪个留下选项1.您可以锁定文件,因为它没有被锁定。

    我还评论该功能是虚假的。你可以删除它。只需尝试您需要执行的任何操作。如果该操作因共享冲突而失败,则表示该文件已被锁定。还要考虑使用该函数的任何代码中的竞争条件。现在解锁文件的事实不会阻止另一方锁定文件,然后才能对其执行任何操作。