1

我有一个小应用程序,用于处理在另一个程序中制作的一些文件。我使用 Angus Johnson 的一个旧组件,称为TDirectoryWatch

在我的 FormCreate 我有以下代码

  DirectoryWatch := TDirectoryWatch.Create(self);
  DirectoryWatch.OnChange := FileAction;
  DirectoryWatch.Directory := Folders.Path(dirInput);
  DirectoryWatch.Active := True;

如果程序启动并且在目录中放置了一个新文件,那么一切都会触发并运行正常。但是如果程序启动时目录中有一个文件,即使我调用 FileAction(nil); 也不会发生任何事情。

FileAction是处理文件的过程的名称

我从弹出菜单调用 FileAction 并处理目录中的文件

所以我的问题是:如何确保在程序启动时处理现有文件?

或者有没有更好的方法来处理这个问题。

为 FileAction 添加了代码

procedure TfrmMain.FileAction(Sender: TObject);
var
  MailFile: string;
  MailInfo: TMailInfo;
  ListAttachments: TstringList;
  i: integer;
  MailBody: string;
begin
  for MailFile in TDirectory.GetFiles(Folders.Path(dirInput), CheckType) do
    begin
      if FileExists(MailFile) then
        begin
          MailInfo := TMailInfo.Create(MailFile);
          try
            if FileProcessing = False then
              begin
                Logfile.Event('Behandler fil: ' + MailFile);
                FileProcessing            := True;
                MailBody                  := '';
                Settings.Load;
                MailInfo.Load;
                Settings.Mail.Signature   := '';
                Settings.Mail.Subject     := MailInfo.Subject;
                ListAttachments           := TStringList.Create;
                ListAttachments.Clear;
                for i := 1 to MaxEntries do
                  begin
                    if (MailInfo.Attachment[i] <> '') and (FileExists(MailInfo.Attachment[i])) then
                      ListAttachments.Add(MailInfo.Attachment[i]);
                  end;
                for i := 1 to MaxEntries do
                  begin
                    MailBody := MailBody + MailInfo.MailBody[i];
                  end;
                try
                  if MailBody <> '' then
                    begin
                      if MailInfo.SenderBcc then
                        Mailing.Send(MailInfo.SenderMail, MailInfo.Recipient, MailInfo.SenderMail, MailInfo.Subject, MailBody, ListAttachments, True)
                      else
                        Mailing.Send(MailInfo.SenderMail, MailInfo.Recipient, MailInfo.Subject, MailBody, ListAttachments, True);
                    end;
                finally
                  ListAttachments.Free;
                end;
                FileProcessing := False;
                DeleteFile(MailFile);
              end;
          finally
            MailInfo.Free;
          end;
        end;
    end;
end;
4

1 回答 1

4

当您的程序启动时,该组件不会通知更改,因为在您的程序启动时,还没有任何更改。

您的政策似乎是在您的程序启动时,所有现有文件都将被视为“新”或“新更改”,因此您手动调用更改通知处理程序的方法是正确的。

组件在检测到更改时唯一要做的就是调用更改通知处理程序。如果你明确地调用了那个函数,但你仍然观察到“什么都没有发生”,那么你的程序中还有更多的深层次问题需要调试;这不是组件或此处描述的基本方法的问题。

于 2013-10-02T16:10:35.867 回答