我正在尝试检测何时将文件写入映射驱动器。在开始处理文件之前,我需要等待文件完全上传到映射的驱动器。问题是将文件写入映射位置的应用程序不会锁定文件。
我尝试了以下内容:
- 检查文件是否正在使用=>不工作,因为文件没有被独占锁定。我可以在将其写入映射驱动器时重命名它。
-get上次访问filestamp比较=>不工作我应该得到一个错误,因为文件属性改变但我不。
-get the file size =>不工作它已经显示了文件的最终大小。
有什么方法可以检测到文件的增长,所以我可以等到它结束了吗?上面列出的所有测试都适用于本地文件,但不适用于由第三方工具写入文件的映射驱动器。如果使用资源管理器并按F5,我可以看到文件大小正在增长。
答案 0 :(得分:0)
感谢收到的所有建议,我设法找到了解决方案。通过互联网搜索我设法得到一个函数,以字节为单位获取文件的大小,就像在资源管理器中显示的那样。问题是,为了工作,我必须等待5秒才能从文件属性中获取第二个值。这是有效的,但为了在自动化系统中可用,我必须让它在一个单独的线程中运行,因为我需要在一个循环(for i:=listbox1.items.count-1 downto 0 do begin
)中使用它来检查列表框中的所有文件,以便知道可以处理。
function GetFileSize_mmg(const FileName: string): Int64;
var
fad: TWin32FileAttributeData;
begin
if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @fad) then
RaiseLastOSError;
Int64Rec(Result).Lo := fad.nFileSizeLow;
Int64Rec(Result).Hi := fad.nFileSizeHigh;
end;
function does_size_changes(filename:string; delay:integer;memo_loguri:Tmemo): boolean;
var size1,size2:int64;
begin
result:=false;
size1:=GetFileSize_mmg(filename);
sleep(delay);
size2:= GetFileSize_mmg(filename);
if size1 <> size2 then
begin
result:=true;
memo_loguri.Lines.Add(datetimetostr(now)+' - file "'+filename+'" is growing: ' +inttostr(size1)+' < '+inttostr(size2));
end
else
begin
result:=false;
memo_loguri.Lines.Add(datetimetostr(now)+' - file "'+filename+'" can be used: '+ inttostr(size1)+' = '+inttostr(size2));
end;
end;
由于