【发布时间】: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