Delphi 2010 - 检测映射驱动器中的文件增长

时间:2015-02-19 12:48:42

标签: delphi delphi-2010

我正在尝试检测何时将文件写入映射驱动器。在开始处理文件之前,我需要等待文件完全上传到映射的驱动器。问题是将文件写入映射位置的应用程序不会锁定文件。

我尝试了以下内容:

- 检查文件是否正在使用=>不工作,因为文件没有被独占锁定。我可以在将其写入映射驱动器时重命名它。

-get上次访问filestamp比较=>不工作我应该得到一个错误,因为文件属性改变但我不。

-get the file size =>不工作它已经显示了文件的最终大小。

有什么方法可以检测到文件的增长,所以我可以等到它结束了吗?上面列出的所有测试都适用于本地文件,但不适用于由第三方工具写入文件的映射驱动器。如果使用资源管理器并按F5,我可以看到文件大小正在增长。

1 个答案:

答案 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;

由于