Delphi 2010 - 检测映射驱动器中的文件增长
Delphi 2010 - Detect file growth in a mapped drive
我正在尝试检测何时将文件写入映射驱动器。在我开始处理它之前,我需要等待文件完全上传到映射的驱动器。问题是将文件写入映射位置的应用程序没有锁定文件。
我试过以下方法:
-检查文件是否正在使用 => 不工作,因为文件未锁定 exclusively.I 可以在将文件写入映射驱动器时重命名它。
-获取上次访问文件戳比较 => 无效。我应该得到一个错误,因为文件属性改变了,但我没有。
-获取文件大小 => 无效。它已经显示了文件的最终大小。
有什么方法可以检测文件的增长,这样我就可以等到它结束了吗?上面列出的所有测试在本地文件上都可以正常工作,但在文件由 3rd 方工具写入的映射驱动器上则不行。如果是使用资源管理器并按 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;
谢谢
我正在尝试检测何时将文件写入映射驱动器。在我开始处理它之前,我需要等待文件完全上传到映射的驱动器。问题是将文件写入映射位置的应用程序没有锁定文件。
我试过以下方法:
-检查文件是否正在使用 => 不工作,因为文件未锁定 exclusively.I 可以在将文件写入映射驱动器时重命名它。
-获取上次访问文件戳比较 => 无效。我应该得到一个错误,因为文件属性改变了,但我没有。
-获取文件大小 => 无效。它已经显示了文件的最终大小。
有什么方法可以检测文件的增长,这样我就可以等到它结束了吗?上面列出的所有测试在本地文件上都可以正常工作,但在文件由 3rd 方工具写入的映射驱动器上则不行。如果是使用资源管理器并按 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;
谢谢