我编写了一个程序,可以执行以下操作...
- 监控文件夹以创建具有特定文件名的新文件,该文件最终将在子文件夹中创建。
- 创建文件后,子文件夹路径将以 TList 的形式添加到队列中。
- 文件必须按照创建顺序进行处理。
- 调用一个过程来处理子文件夹中的所有文件(在本例中为图像),其中涉及将文件移动到网络位置。
- 子文件夹路径已从队列 (TList) 中删除。
- 如果队列中存在更多路径,则将下一个路径传递给处理过程。
我遇到的问题是,将文件复制到网络位置的时间根据图像的数量和大小而变化,因此...
有没有办法让Delphi等待文件操作过程完成?
我尝试了一个 while 循环,等待 bool 值更改(在网络上找到最后一个要复制的文件时更改),但挂起应用程序(即使使用 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;
<小时/>
我想我已经找到答案了...我将在单个线程中执行所有文件操作,并在启动时设置一个全局“忙” bool 值,并在完成时再次更改它。 这样,当任何文件操作正在进行时,外壳监视器就不会错过消息。
最佳答案
您可以实现文件系统监视。本质上,您使用以下标志创建一个文件句柄:
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?
我唯一要做的不同就是在创建类时提供一个事件来通知更改(请记住,在执行过程中调用该事件时,它可能需要同步)。
关于delphi - 有没有办法让我的delphi程序等待大量文件被复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8215710/