ファイルの名前を指定して、ファイルが現在開いているか使用中であるかを確認するにはどうすればよいですか?(私はPerlファイルハンドルではなくファイルについて話している。)
オペレーティングシステム固有のソリューションではなく、汎用のPerlソリューションを探していることに注意してください。少なくとも、WindowsとGNU/Linuxベースのシステムの両方で機能するものが欲しいです。
POSIX は、これを行う方法を提供していません。したがって、現在利用可能なポータブル O/S インターフェイスを考えると、ポータブル ソリューションは不可能です。
オープニングビットへの単一のアクセスポイントを提供する、より高いレベルのアプローチを作成する必要があります。ロックファイルのようなものです。
次のスニペットを参照してください (Linux/Unix のみ。実行している OS は指定しません)。
ワンライナーで:
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
Try this
use strict;
open(IN, ">test");
print IN "Hello";
close(IN);
if(fileno(IN) == undef )
{
print "File is CLOSED\n";
}
Scalar::Utilモジュールは、このための関数を提供しますopenhandle()
。fileno()とは異なり、OS ファイルハンドルに関連付けられていない 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
ファイルハンドルを開きたくないことはわかっていますが、IMOの最も簡単な方法はおそらく次のとおりです。
open my $myfh, '<', $my_file or die "Couldn't open $my_file: $!";