我需要等到映射的网络文件夹(\ HostName \ NetworkPath)变空。我的意思是,直到该网络文件夹为空,程序流才能继续。
到目前为止,我具有以下逻辑,但是我注意到,FindFirst注意到网络文件夹变空需要花费一些时间。
如果我一直观察到打开的资源管理器窗口,并指向该网络文件夹,我会发现它在 FindFirst注意到它之前很早就变成空了。
我用Sleep(5000)在我的while循环中再次调用CheckNetworkFolderIsEmpty引入了一些延迟,否则会经常调用它。但是也许该文件夹将在5秒之前变空,所以5秒是一个任意时间延迟,如果该文件夹之前变空,则可能导致程序执行中不必要的交易。
可能是罪魁祸首,什么是更好的选择?
我也不知道除了简单的睡眠以外还有什么用。
while not CheckRawFolderIsEmpty do begin
Sleep(5000);
end;
function TForm1.CheckNetworkFolderIsEmpty: Boolean;
begin
Result := (CountFilesInFolder('\\HostName\NetworkPath', '*.txt') = 0);
end;
function CountFilesInFolder(const aPath, aFileMask: string): Integer;
var
Path: string;
SearchRec: TSearchRec;
begin
Path := IncludeTrailingPathDelimiter(aPath);
Result := 0;
if FindFirst(Path + aFileMask, faAnyFile and not faDirectory, SearchRec) = 0 then begin
repeat
Inc(Result);
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;
答案 0 :(得分:4)
像您一样观察文件系统的更改效率很低(bison
,FindFirst
),并且在您学到的知识时还不够准确。 Windows FindFirstChangeNotification为此目的提供了API J...,
好消息是您不需要从头开始研究API,因为其他人为您做了辛苦的工作。查看有关API的Delphi的一些免费软件包装器: