有没有办法让我的delphi程序等待大量文件被复制?

时间:2011-11-21 17:15:02

标签: delphi

我写了一个执行以下操作的程序......

  • 监控文件夹,以创建具有特定文件名的新文件,该文件最终将在子文件夹中创建。
  • 在创建文件时,子文件夹路径以TList的形式添加到队列中。
  • 必须按创建顺序处理文件。
  • 调用一个过程来处理子文件夹中的所有文件(本例中的图像),这涉及将文件移动到网络位置。
  • 子文件夹路径将从队列中删除(TList)。
  • 如果队列中存在更多路径,则将下一个路径传递给处理过程。

我遇到的问题是将文件复制到网络位置的时间因图像的数量和大小而异...

有没有办法让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监视器不会丢失消息。

1 个答案:

答案 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过程中调用事件时可能需要同步)。