【问题标题】:Delphi 2010 - Is File in Use?Delphi 2010 - 文件正在使用中吗?
【发布时间】:2015-02-06 10:41:42
【问题描述】:

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

谢谢

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;

【问题讨论】:

  • 我看不出为什么它在远程卷上的行为会有所不同。我也根本看不到该功能的必要性?为什么要锁定文件然后立即解锁?尝试复制,如果您遇到共享冲突,则其他人已将其锁定。
  • 一台服务器(x) 开始将数据文件复制到另一台服务器(y)。我需要处理来自(y)位置的文件,因此我映射了一个指向该位置文件夹的驱动器。然后我列出所有文件。如果文件正在使用(仍在从服务器 x 复制到服务器 y),那么我将该文件从操作中排除。成功完成的所有其他文件都将上传到 ftp 服务器。这就是为什么我需要查看是否使用了文件,否则我怎么知道复制过程已经结束。我无法控制 x 或 y 服务器。
  • 正如大卫所说,您只需尝试复制文件。如果您遇到异常,则无法复制它并且复制过程尚未结束。如果你打算使用你现在得到的代码,至少改变它以保持文件打开并返回文件句柄。反复打开/关闭/再次尝试打开是脆弱的;文件的可用性可以在调用 IsFileInUse 和复制操作之间改变。
  • 我实际上像您一样使用了该功能-我发现(在撰写本文时,也就是 2021 年)如果文件位于只写磁盘(例如 SD 卡)上,则该功能成功。只有真正的读写操作失败!

标签: delphi delphi-2010


【解决方案1】:

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

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

我认为最终选项可以立即被拒绝。选项 2 似乎不太可能。剩下选项 1。您可以锁定文件,因为它没有被锁定。

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

【讨论】:

  • 感谢您的信息。我已经分析了服务器,真正的问题是开始将文件复制到映射驱动器的服务器没有锁定文件。我可以在复制时重命名它。在这种情况下,解决问题的真正选择可能是比较文件大小,看看它是否在几秒钟内增长。
  • @user2858981 不要只依赖文件大小检查。如果其他进程正在重写部分文件数据怎么办?如果其他进程在执行任何复制操作之前通过创建具有最终大小的文件来保留磁盘空间怎么办?所以至少要做 botj 文件大小和上次文件访问时间戳比较。
  • 我尝试检查时间戳比较。当要复制的命令是从 Windows 创建的时,这是一个可靠的测试。不幸的是,此测试在由 3rd 方服务器创建的文件上失败。我也怀疑文件大小增长会失败。是否有其他解决方案可以确定文件是否 100% 复制?
  • @user2858981 您已经回答了您提出的问题。我有理由相信我回答了你提出的问题。如果您想对您的问题和我的回答提出疑问,我将很乐意提供帮助。但我不想评论您当前超出此问题范围的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2011-09-10
  • 2011-04-03
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多