Подтвердить что ты не робот

Как проверить, открыт ли дескриптор файла в Perl?

Есть ли способ проверить, открыт ли файл на Perl? Я хочу иметь доступ к файлу чтения, поэтому не требуйте flock.

 open(FH, "<$fileName") or die "$!\n" if (<FILE_IS_NOT_ALREADY_OPEN>);
 #  or something like
 close(FH) if (<FILE_IS_OPEN>);
4b9b3361

Ответ 1

Обратитесь к ответу openhandle() от Scalar::Util. Ответ, который я изначально написал здесь, когда-то был лучшим, что мы могли бы сделать, но теперь он сильно устарел.

Ответ 2

Модуль 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

Ответ 3

Зачем вам это нужно? Единственная причина, по которой я могу думать, это когда вы используете дескрипторы файлов старого стиля (которые вы, похоже, делаете), и хотите предотвратить случайное сохранение одного дескриптора над другим.

Эта проблема может быть решена с помощью дескрипторов косвенных дескрипторов нового стиля.

open my $fh, '<', $filename or die "Couldn't open $filename: $!";

Ответ 4

Perl предоставляет fileno для этой цели.

РЕДАКТИРОВАТЬ Я исправляю цель fileno(). Я предпочитаю более короткий тест

fileno FILEHANDLE

над

tell FH != -1

Ответ 5

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.

Ответ 6

Почему вас это волнует, если он уже открыт? Вы пытаетесь поймать одновременное чтение?

Вам действительно не нужно заботиться о закрытии файла. Либо он не открывается, а закрывается, потому что ему нечего закрывать, или файл открыт, а закрытие его отпускает. В любом случае, файл не открыт на этом дескрипторе файла. Просто закройте дескриптор файла, не заботясь о нем, если он не открыт. Вы видите там что-то странное?