Узнайте в Perl и Windows, доступен ли файл для записи / удаления

Я хотел бы встроить в Perl под Windows сторожевую собаку для горячей папки (я бы назвал ее папкой для просмотра или, хм, возможно, гораздо лучше: хот-дог). До сих пор мне удалось именно это, с 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. Кроме этого я открыт для предложений.

1 ответ

Решение

Да! Я решил это (спасибо Сухой27)!

Вставка следующего кода прямо перед перемещением файла:

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

...в то время как writeable относится к этой маленькой субмарине:

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

Спасибо, и удачного дня!:-)

Другие вопросы по тегам