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

标签 delphi

我编写了一个程序,可以执行以下操作...

  • 监控文件夹以创建具有特定文件名的新文件,该文件最终将在子文件夹中创建。
  • 创建文件后,子文件夹路径将以 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/

相关文章:

android - 如果应用程序启动后允许位置,Delphi Android 位置传感器不起作用

delphi - 直线与三角形边的交点

delphi - 是否可以像TWebBrowser一样在Delphi中使用Microsoft Edge(Chromium引擎)?

windows - 什么可以使程序第二次运行得更快?

delphi - VCL.图形库到FMX

Delphi:WSAAddressToString 返回错误代码 10022 (WSAEINVAL)

delphi - 在 Delphi 中淡入 alpha 混合 PNG 表单

delphi - Delphi 是否有任何工具或插件可以用来帮助重构非面向对象的代码?

delphi - DeferWindowPos 是否与 VCL 配合良好?

c# - 是否可以将此 Delphi 函数转换为 C# 方法?如何?