6

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

请注意,我正在寻找一种通用的 Perl 解决方案,而不是特定于操作系统的解决方案。至少,我想要在 Windows 和基于 GNU/Linux 的系统上都可以工作的东西。

4

8 回答 8

5

POSIX 没有提供任何方法来做到这一点。因此,鉴于当前可用的便携式 O/S 接口,没有便携式解决方案是可能的。

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

于 2012-06-18T11:44:46.757 回答
0

请参阅以下片段(仅限 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
于 2012-05-30T11:11:10.790 回答
-1

尝试标量::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
于 2012-05-30T19:00:14.740 回答
-1

试试这个

use strict;
open(IN, ">test");
print IN "Hello";
close(IN);
if(fileno(IN) == undef )
{
    print "File is CLOSED\n";
}
于 2012-06-01T11:41:59.473 回答
-1

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

于 2014-10-20T17:11:56.690 回答
-1

我阅读了大量帖子,但没有找到我正在寻找的解决方案。就我而言,我有一个 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 ... ";
  }
}
于 2019-02-22T01:51:14.527 回答
-1

尝试重命名文件,如果打开会失败。

于 2021-12-11T16:38:12.543 回答
-2

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

open my $myfh, '<', $my_file or die "Couldn't open $my_file: $!";
于 2012-06-01T12:08:14.617 回答