Узнайте в 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);
}
Спасибо, и удачного дня!:-)