Delphi 如何检测文件夹更改何时完成?

Delphi 如何检测文件夹更改何时完成?,delphi,tthread,readdirectorychangesw,Delphi,Tthread,Readdirectorychangesw,我使用Delphi和ReadDirectoryChangesW(在TThread中)来检测特定文件夹何时发生了更改。这是相当不错的工作。我需要知道更改何时完成,这样我就可以安全地对文件执行某些操作 以下是场景:我已将打印机映射到特定的文件名和文件夹(文件:local portc:\MonitorMe\prinfil.dat)。文件夹中唯一的文件将是该打印机文件。打印作业可以是单页,也可以是数百页,我必须等到“打印到文件”完成后才能触发进一步的操作。我正在监视文件\u NOTIFY\u CHANG

我使用Delphi和
ReadDirectoryChangesW
(在
TThread
中)来检测特定文件夹何时发生了更改。这是相当不错的工作。我需要知道更改何时完成,这样我就可以安全地对文件执行某些操作

以下是场景:我已将打印机映射到特定的文件名和文件夹(文件:local port
c:\MonitorMe\prinfil.dat
)。文件夹中唯一的文件将是该打印机文件。打印作业可以是单页,也可以是数百页,我必须等到“打印到文件”完成后才能触发进一步的操作。我正在监视
文件\u NOTIFY\u CHANGE\u SIZE
文件\u NOTIFY\u CHANGE\u LAST\u WRITE
——因此我会定期收到通知,文件仍在“打印到”

我正在寻找一种安全的方法来检测“打印”何时完成。我想我可以在表单中设置一个计时器,并在线程中调用
Synchronize(StillPrinting)
StillPrinting
将停止并重新启动计时器,这样只有在大约300毫秒没有文件夹更改后,计时器才会执行-在PrintComplete事件后触发
OnAfterPrintComplete。这似乎很危险

我是否可以寻找任何东西来确定文件保存是否已完成?

“文件已完成”是主观的-只需思考5分钟,你就会得出结论,你要求的东西很少有意义:

  • 写入速度可能会有所不同:您可能希望在一个系统上用2秒钟写入一个文件,而在另一个系统上则需要5分钟
  • 画线:在哪一点上,你认为一个“写”要完成,而其他写“强”在哪一点附加到现有的<强>文件?关于日志的事情,它可能需要2年的时间,直到另一次写入该文件。同样,无论出于何种原因,打印机作业/程序可能会闲置10分钟,但仍然可以访问文件
  • 修改:如果一个文件从字节1写入52000,但之后字节10到19被覆盖,那么该文件会怎么样?何时视为“完成”
  • 即使只在给定点“剪切”(或扩展)文件,但没有人知道是否会在任何位置发生额外的写入操作
没有。但实现这一目标有多种方法:

  • 设置文件属性,即
    R
    可能表示不再发生写入操作。因为作为消费者,您无论如何只需要读访问权限。当然,“打印机”必须设置它
  • 检查文件内容是否有有效页脚,或其任何格式是否不完整。这要求您知道打印文件格式,并且打印文件要有一个格式(而不仅仅是二进制流)
  • 试图在没有任何共享权限的情况下打开文件(甚至不是
    文件共享\u读取
    )-只要另一个进程访问该文件,此操作就会失败。您可以预期打印机作业不会多次打开/关闭文件(尽管也有可能)
  • 滥用文件作为“写入完成”标记:如果文件已写入,则创建另一个(空)文件,其单独存在表示另一个文件已完成。根据您的打印作业/程序,您可以添加另一个简短/简单的打印任务,并判断只要存在两个文件,就必须完成其中一个感兴趣的文件(而另一个与您无关)
“文件已完成”是主观的-只需思考5分钟,你就会得出结论,你所要求的东西几乎没有意义:

  • 写入速度可能会有所不同:您可能希望在一个系统上用2秒钟写入一个文件,而在另一个系统上则需要5分钟
  • 画线:在哪一点上,你认为一个“写”要完成,而其他写“强”在哪一点附加到现有的<强>文件?关于日志的事情,它可能需要2年的时间,直到另一次写入该文件。同样,无论出于何种原因,打印机作业/程序可能会闲置10分钟,但仍然可以访问文件
  • 修改:如果一个文件从字节1写入52000,但之后字节10到19被覆盖,那么该文件会怎么样?何时视为“完成”
  • 即使只在给定点“剪切”(或扩展)文件,但没有人知道是否会在任何位置发生额外的写入操作
没有。但实现这一目标有多种方法:

  • 设置文件属性,即
    R
    可能表示不再发生写入操作。因为作为消费者,您无论如何只需要读访问权限。当然,“打印机”必须设置它
  • 检查文件内容是否有有效页脚,或其任何格式是否不完整。这要求您知道打印文件格式,并且打印文件要有一个格式(而不仅仅是二进制流)
  • 试图在没有任何共享权限的情况下打开文件(甚至不是
    文件共享\u读取
    )-只要另一个进程访问该文件,此操作就会失败。您可以预期打印机作业不会多次打开/关闭文件(尽管也有可能)
  • 滥用文件作为“写入完成”标记:如果文件已写入,则创建另一个(空)文件,其单独存在表示另一个文件已完成。根据您的打印作业/程序,您可以添加另一个简短/简单的打印任务,并判断只要存在两个文件,就必须完成其中一个感兴趣的文件(而另一个与您无关)

感谢您的评论-在这种情况下,只有一个进程写入该特定文件。这是一个程序