如何确定一个文件是否正在被打开或使用?(我说的是文件而不是Perl文件句柄。)
请注意,我正在寻找通用的Perl解决方案,而不是特定于操作系统的解决方案。至少,我希望能够在Windows和GNU/Linux系统上运行。
如何确定一个文件是否正在被打开或使用?(我说的是文件而不是Perl文件句柄。)
请注意,我正在寻找通用的Perl解决方案,而不是特定于操作系统的解决方案。至少,我希望能够在Windows和GNU/Linux系统上运行。
POSIX没有提供任何方法来做到这一点。因此,鉴于当前可用的便携式操作系统接口,没有可移植解决方案。
你需要设计一些更高级的方法,以提供单个访问点来打开这些位。就像锁定文件一样。
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
cygwin
来解决这个问题。 - Gilles Quénotfstat
而不是lsof
。 - tchrist我知道已经有一段时间了,但对于Windows来说,我在检测文件是否正在被写入方面运气不错,只需尝试锁定文件(没有花哨的东西 - 只需打开以进行读取,使用Perl内部flock并关闭文件)。这似乎甚至可以在网络文件上工作。我不确定这是否适用于Linux(它可能适用于写入),也不知道它是否可以检测其他文件读取器。
尝试使用Scalar::Util
Scalar::Util模块提供了openhandle()
函数。与fileno()不同,它处理与OS文件句柄无关的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
我阅读了很多帖子,但没有找到我要寻找的解决方案。在我的情况下,我有一个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 ... ";
}
}
试试这个
use strict;
open(IN, ">test");
print IN "Hello";
close(IN);
if(fileno(IN) == undef )
{
print "File is CLOSED\n";
}
我知道你不想打开文件句柄,但在我看来这可能是最简单的方法:
open my $myfh, '<', $my_file or die "Couldn't open $my_file: $!";