我写了一个执行以下操作的程序......
我遇到的问题是将文件复制到网络位置的时间因图像的数量和大小而异...
有没有办法让Delphi等文件操作程序完成?
我尝试了一个等待布尔值更改的while循环(当在网络上找到要复制的最后一个文件时更改)但挂起了应用程序(即使使用application.processMessage)并且dirMonitor组件无法添加TList的下一个子文件夹。
任何建议都会受到最高的赞赏。
提前致谢。
感谢您的回复......
我看过OmniThread看起来很理想......虽然我只能访问Delphi 7,所以不用了。
我遇到的问题是文件夹由于大小和网络流量等原因而需要花费不同的时间进行传输...当一个包含大量图像的文件夹后跟一个只有少量图像的文件夹时,两者中的第一个是到达网络目的地。网络设计是第三方打印假脱机程序,因此打印出错的顺序。
简化代码:
procedure TForm1.programTimerTimer(Sender: TObject);
begin
if (fileOperationInProgress = false) AND (programPaused = false) then
begin
processOrderQueue;
end;
end;
procedure TForm1.processOrderQueue;
begin
// gets folder paths from queue
// processes images
// copy to print spooler (network location)
copyFolder(fromPath, toPath);
// remove temp files
end;
procedure TForm1.copyFolder(copyFrom : String; copyTo : String);
var
fos : TSHFileOpStruct;
begin
fileOperationInProgress := True;
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_COPY;
fFlags := FOF_FILESONLY or FOF_SILENT;
pFrom := PChar(copyFrom);
pTo := PChar(copyTo)
end;
ShFileOperation(fos);
fileOperationInProgress := False;
end;
想想我已经得到了答案......我将在一个线程中执行所有文件操作,并在启动时设置全局“忙”布尔值,并在完成时再次更改它。 这样,当任何文件操作正在进行时,shell监视器不会丢失消息。
答案 0 :(得分:1)
您可以实现文件系统监视。实质上,您使用以下标志创建文件句柄:
CreateFile(PChar(FDirectoryToWatch), FILE_LIST_DIRECTORY or GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0);
然后创建一个循环来调用ReadDirectoryChangesW。
Linked是一个示例类: Why does ReadDirectoryChangesW omit events?
我唯一要做的就是在创建类时提供一个事件来通知更改(记住在Execute过程中调用事件时可能需要同步)。