Есть ли способ проверить, открыт ли файл на Perl?
Я хочу иметь доступ к файлу чтения, поэтому не требуйте flock
.
open(FH, "<$fileName") or die "$!\n" if (<FILE_IS_NOT_ALREADY_OPEN>);
# or something like
close(FH) if (<FILE_IS_OPEN>);
Есть ли способ проверить, открыт ли файл на Perl?
Я хочу иметь доступ к файлу чтения, поэтому не требуйте flock
.
open(FH, "<$fileName") or die "$!\n" if (<FILE_IS_NOT_ALREADY_OPEN>);
# or something like
close(FH) if (<FILE_IS_OPEN>);
Обратитесь к ответу openhandle()
от Scalar::Util
. Ответ, который я изначально написал здесь, когда-то был лучшим, что мы могли бы сделать, но теперь он сильно устарел.
Модуль Scalar:: Util предоставляет openhandle()
для этого. В отличие от fileno(), он обрабатывает дескрипторы файлов perl, которые не связаны с дескрипторами файлов ОС. В отличие от tell(), он не выдает предупреждений при использовании в неоткрытом дескрипторе файла. Из модуля документация:
openhandle FH
Returns FH if FH may be used as a filehandle and is open, or FH is a tied handle. Otherwise "undef" is returned. $fh = openhandle(*STDIN); # \*STDIN $fh = openhandle(\*STDIN); # \*STDIN $fh = openhandle(*NOTOPEN); # undef $fh = openhandle("scalar"); # undef
Зачем вам это нужно? Единственная причина, по которой я могу думать, это когда вы используете дескрипторы файлов старого стиля (которые вы, похоже, делаете), и хотите предотвратить случайное сохранение одного дескриптора над другим.
Эта проблема может быть решена с помощью дескрипторов косвенных дескрипторов нового стиля.
open my $fh, '<', $filename or die "Couldn't open $filename: $!";
Perl предоставляет fileno для этой цели.
РЕДАКТИРОВАТЬ Я исправляю цель fileno()
. Я предпочитаю более короткий тест
fileno FILEHANDLE
над
tell FH != -1
Tell выдает предупреждение (также stat, -s, -e и т.д.) с use warnings
(-w)
perl -wle '
open my $fh, "<", "notexists.txt";
print "can stat fh" if tell $fh
'
tell() on closed filehandle $fh at -e line 1.
-1
Альтернативы fileno($fh)
и eof($fh)
не выдают предупреждений.
Я нашел, что лучшей альтернативой было сохранение вывода из open
.
Почему вас это волнует, если он уже открыт? Вы пытаетесь поймать одновременное чтение?
Вам действительно не нужно заботиться о закрытии файла. Либо он не открывается, а закрывается, потому что ему нечего закрывать, или файл открыт, а закрытие его отпускает. В любом случае, файл не открыт на этом дескрипторе файла. Просто закройте дескриптор файла, не заботясь о нем, если он не открыт. Вы видите там что-то странное?