-1

我想在 Windows 下的 Perl中为Hot-Folder构建一个Watch-Dog(我可以称它为Folder-Watch,或者,嗯,可能更好:一个Hot-Dog)。到目前为止,我成功地做到了这一点,(参见下面的示例)。Win32::ChangeNotify

$watchdir但正如您可能会猜到阅读源代码时,当文件的复制/创建过程尚未完成(没有此类文件或目录)时,当移动过程想要完成时,我遇到了一个问题。

use Win32::ChangeNotifier;
use File::Copy qw(move);

my $notify = Win32::ChangeNotify->new($watchdir, 0, "FILE_NAME");
while (1) {
  if ($notify->wait(1_000)) {  # 1-second wait cycle
    notify->reset;
    @foundfiles = File::get_by_ext($watchdir, "csv");  # search and return files in $watchdir with extension "csv"
    print "Something has happened! (del/ren/create)\n";
    foreach (@foundfiles) {
      move($watchdir.$_, $someotherdir.$_) or die "Fehler: $!"; 
    }
    @foundfiles = ();
  }
}

有没有办法自动找出文件是否准备就绪,即最终是否已创建/复制?

我在想类似的东西

while (1) {
  move $file if (-w $file)  # writeable
  wait(1)
}

但这似乎在 Windows 下不起作用。我需要在 Windows 和 Perl 下解决这个问题。除此之外,我愿意接受建议。

4

1 回答 1

1

是的!我解决了(感谢Сухой27)!

在移动文件之前插入以下代码:

while (1) {
    last if writeable($path_in.$_);
    print "-";
    $| = 1;
    sleep(1);
}

...而writeable指的是这个小潜艇:

sub writeable {
    return open(my $file, ">>", shift);
}

谢谢,祝你有美好的一天!:-)

于 2015-02-25T18:02:02.597 回答