给定文件的名称,我如何确定该文件当前是打开还是正在使用?(我说的是文件而不是 Perl 文件句柄。)
请注意,我正在寻找一种通用的 Perl 解决方案,而不是特定于操作系统的解决方案。至少,我想要在 Windows 和基于 GNU/Linux 的系统上都可以工作的东西。
POSIX 没有提供任何方法来做到这一点。因此,鉴于当前可用的便携式 O/S 接口,没有便携式解决方案是可能的。
您必须制定一些更高级别的方法,为开放位提供单点访问。就像锁定文件一样。
请参阅以下片段(仅限 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
尝试标量::Util
Scalar::Util模块openhandle()
为此提供了功能。与fileno()不同,它处理与操作系统文件句柄无关的 perl 文件句柄。与tell()不同,它在未打开的文件句柄上使用时不会产生警告来自模块的文档:
开口手柄 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
试试这个
use strict;
open(IN, ">test");
print IN "Hello";
close(IN);
if(fileno(IN) == undef )
{
print "File is CLOSED\n";
}
我知道已经有一段时间了,但是对于 Windows,我很幸运地通过尝试锁定文件来检测正在写入的文件(没什么特别的 - 只需打开以供读取,使用 Perl 内部群并关闭文件)。这似乎甚至适用于网络文件。我不太确定这是否适用于 Linux(它可能在写入时),我不知道它是否可以检测到其他文件读取器。
我阅读了大量帖子,但没有找到我正在寻找的解决方案。就我而言,我有一个 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 ... ";
}
}
尝试重命名文件,如果打开会失败。
我意识到您不想打开文件句柄,但这可能是 IMO 最简单的方法:
open my $myfh, '<', $my_file or die "Couldn't open $my_file: $!";