Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 2010-检测映射驱动器中的文件增长_Delphi_Delphi 2010 - Fatal编程技术网

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

Delphi 2010-检测映射驱动器中的文件增长,delphi,delphi-2010,Delphi,Delphi 2010,我试图检测文件何时写入映射驱动器。我需要等待文件完全上传到映射驱动器,然后才能开始处理它。问题是将文件写入映射位置的应用程序没有锁定文件 我尝试了以下方法: -检查文件是否正在使用=>未工作,因为文件未以独占方式锁定。我可以在将其写入映射驱动器时重命名它 -获取上一次访问的文件stamp comparison=>不工作。我应该得到一个错误,因为文件属性改变,但我没有 -获取文件大小=>不工作。它已经显示了文件的最终大小 是否有任何方法可以检测到文件的增长,以便我可以等到它结束?上面列出的所有测试

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

我尝试了以下方法:

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

-获取上一次访问的文件stamp comparison=>不工作。我应该得到一个错误,因为文件属性改变,但我没有

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


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

感谢收到的所有建议,我设法想出了一个解决方案。通过internet搜索,我获得了一个函数,该函数以字节为单位获取文件的大小,就像在浏览器中显示的那样。问题是为了工作,我必须等待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;
函数GetFileSize\u mmg(const FileName:string):Int64; 变量 fad:TWin32FileAttributeData; 开始 如果不是GetFileAttributesEx(PChar(文件名)、GetFileExInfo标准、@fad),则 赖斯·塞罗; Int64Rec(Result).Lo:=fad.nFileSizeLow; Int64Rec(Result).Hi:=fad.nFileSizeHigh; 结束; 函数不更改大小(文件名:字符串;延迟:整数;备注:Tmemo):布尔值; 变量size1,size2:int64; 开始 结果:=假; size1:=GetFileSize\u mmg(文件名); 睡眠(延迟); size2:=GetFileSize\u mmg(文件名); 如果大小为1,则大小为2 开始 结果:=真; memo_loguri.Lines.Add(datetimetostr(现在)+'-file“+filename+”)正在增长:'+inttostr(size1)+'<'+inttostr(size2)); 结束 其他的 开始 结果:=假; memo_loguri.Lines.Add(datetimetostr(现在)+'-file“+filename+”)可以使用:'+inttostr(size1)+'='+inttostr(size2)); 结束; 结束;
谢谢

您需要修复根本问题。@David-意思是这是唯一的方法,或者它无论如何都需要修复?我们是否应该认为您无法控制writer应用程序?如果没有提供详细信息,我真的看不出有人能帮上什么忙。任何黑客的解决方法都必然依赖于所涉及的系统和代码知识。也许作者在完成时会广播一条消息。我们只能猜测。你不能具体点吗?”-获取上次访问filestamp comparison=>不起作用。我应该会得到一个错误,因为文件属性发生了更改,但我不知道“到底什么不起作用?”?为什么查询时间戳时会出现错误?如果打开该文件进行读取,则可以使用
GetFileTime()
而不会出错。否则,您可以使用
FindFirstFile()
GetFileAttributesEx()
,这两种方法都不需要打开文件,因为它们从文件系统获取元数据。