如何使用Perl检查文件是否打开?

时间:2012-05-30 11:05:42

标签: perl file

鉴于文件的名称,如何确定文件当前是打开还是正在使用? (我说的是文件而不是Perl文件句柄。)

请注意,我正在寻找通用的Perl解决方案,而不是特定于操作系统的解决方案。至少,我希望在Windows和基于GNU / Linux的系统上都有效。

7 个答案:

答案 0 :(得分:4)

POSIX没有提供任何方法来执行此操作。因此,鉴于目前的便携式O / S接口可用,因此无法实现便携式解决方案。

您必须制定一些更高级别的方法,为开放位提供单点访问。就像锁文件一样。

答案 1 :(得分:1)

请参阅以下代码段(仅限Linux / Unix,您没有告诉我们您运行的操作系统):

单行:

perl -e 'my $file = $ARGV[0]; print "file $file is opened" if `lsof $file`;' FILE

在剧本中:

#!/usr/bin/env perl -w

use strict;

my $file = $ARGV[0];
print "file $file is opened\n" if `lsof $file`;

运行它:

./script.pl FILENAME

答案 2 :(得分:0)

尝试Scalar::Util

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

答案 3 :(得分:0)

试试这个

use strict;
open(IN, ">test");
print IN "Hello";
close(IN);
if(fileno(IN) == undef )
{
    print "File is CLOSED\n";
}

答案 4 :(得分:0)

我知道它已经有一段时间但是对于Windows我有一些相当不错的运气通过尝试锁定文件来检测文件正在被写入(没什么特别的 - 只是打开阅读,使用Perl内部flock并关闭文件)。这似乎甚至可以在网络文件上工作。我不太确定这是否适用于Linux(可能在写入时),我不知道它是否可以检测到其他文件读取器。

答案 5 :(得分:0)

我看了很多帖子,但没有找到我想要的解决方案。就我而言,我有一个for循环,用于创建和关闭大量文件。我想检查我创建的文件处理程序是否打开。这就是你的做法

use IO::Handle;

if (something matches create a file)
{
  open( $signoff_report_html, '>', "$val21");
}
elsif ( ... )
{
  #keep doing amazing stuff
}
else
{
   if ($signoff_report_html->opened()) 
   {    
      #file is ok
      print "File is opened and ready\n";       
  }
  else 
  {
      print "File was closed ... ";
  }
}

答案 6 :(得分:-1)

我意识到你不想打开文件句柄,但它可能是IMO最简单的方法:

open my $myfh, '<', $my_file or die "Couldn't open $my_file: $!";