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



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

我试过以下几种:

-检查文件是否正在使用=>因为文件未以独占方式锁定而无法工作。当它被写入映射驱动器时,我可以重命名它。

-获取上次访问的文件戳比较=>不起作用。我应该得到一个错误,因为文件属性改变了,但我没有。

-获取文件大小=>不起作用。它已经显示了文件的最终大小。

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

感谢收到的所有建议,我终于想出了解决方案。在互联网上搜索时,我设法获得了一个函数,该函数以字节为单位获取文件的大小,就像在浏览器中显示的那样。问题是,为了工作,我必须等待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;

感谢

最新更新