如何检查文件句柄是否在Perl中打开?

时间:2009-02-06 13:04:36

标签: perl file-io filehandle

有没有办法检查文件是否已在Perl中打开? 我想要读取文件,因此不需要flock

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

6 个答案:

答案 0 :(得分:38)

请参阅answer regarding openhandle() from Scalar::Util。我最初在这里写的答案曾经是我们能做到的最好的答案,但它现在已经过时了。

答案 1 :(得分:22)

Scalar::Util模块为此提供openhandle()功能。与fileno()不同,它处理与OS文件句柄无关的perl文件句柄。与tell()不同,它在未打开的文件句柄上使用时不会产生警告来自模块的documentation

  

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

答案 2 :(得分:12)

你为什么要那样做?我能想到的唯一原因是当你使用旧式包文件句柄(你似乎正在做)并希望防止意外地将一个句柄保存在另一个句柄上时。

可以使用新样式间接文件句柄来解决该问题。

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

答案 3 :(得分:8)

Perl为此提供了fileno函数。

编辑我的目的是fileno()。我更喜欢较短的测试

fileno FILEHANDLE

tell FH != -1

答案 4 :(得分:1)

Tell使用use warnings( - w)

生成警告(stat,-s,-e等等)
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的输出。

答案 5 :(得分:0)

为什么你关心它是否已经打开?你想要同时阅读吗?

您真的不需要关心关闭文件。要么它没有打开而且关闭失败,因为它没有什么可以关闭,或者文件是打开的,关闭是释放它。无论哪种方式,该文件句柄上的文件都没有打开。如果没有打开,只需关闭文件句柄而不关心它。你在那里看到一些奇怪的东西吗?