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

Gav*_*vin 6 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;
Run Code Online (Sandbox Code Playgroud)

想想我已经得到了答案......我将在一个线程中执行所有文件操作,并在启动时设置全局"忙"布尔值,并在完成时再次更改它.这样,当任何文件操作正在进行时,shell监视器不会丢失消息.

tmj*_*ac2 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);
Run Code Online (Sandbox Code Playgroud)

然后创建一个循环来调用 ReadDirectoryChangesW。

Linked 是一个示例类: Why does ReadDirectoryChangesW omit events?

我唯一要做的不同就是在创建类时提供一个事件来通知更改(请记住,在执行过程中调用该事件时,它可能需要同步)。