鉴于文件的名称,如何确定文件当前是打开还是正在使用? (我说的是文件而不是Perl文件句柄。)
请注意,我正在寻找通用的Perl解决方案,而不是特定于操作系统的解决方案。至少,我希望在Windows和基于GNU / Linux的系统上都有效。
答案 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模块为此提供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: $!";