鑑於文件的名稱,如何確定文件當前是打開還是正在使用? (我正在談論文件而不是Perl文件句柄。)如何檢查一個文件是否使用Perl打開?
請注意,我正在尋找一種通用的Perl解決方案,而不是特定於操作系統的解決方案。至少,我希望能夠在Windows和基於GNU/Linux的系統上運行。
鑑於文件的名稱,如何確定文件當前是打開還是正在使用? (我正在談論文件而不是Perl文件句柄。)如何檢查一個文件是否使用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
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
試試這個
use strict;
open(IN, ">test");
print IN "Hello";
close(IN);
if(fileno(IN) == undef)
{
print "File is CLOSED\n";
}
我在問文件而不是文件句柄。 – Sam
我知道你不不想打開文件句柄,但它可能是最簡單的方法IMO:
open my $myfh, '<', $my_file or die "Couldn't open $my_file: $!";
我認爲你通常可以在閱讀模式下打開文件,即使它們已經在其他地方打開了。 – Sam
我知道它已經有一段時間了,但對於Windows我有一些相當不錯的運氣,通過試圖鎖定文件來檢測文件正在被寫入(沒有什麼奇特的 - 只是打開閱讀,使用Perl內部羣並關閉文件)。這似乎甚至可以在網絡文件上工作。我不確定這是否適用於Linux(可能會寫入),但我不知道它是否可以檢測到其他文件讀取器。
重複的http://stackoverflow.com/questions/520196/how-can-i-check-if-a-filehandle-is-open-in-perl – cppcoder
@cppcoder:你提到的問題似乎關於正在打開的文件句柄。我在談論這個問題中的文件。 – Sam
POSIX不提供任何方式來執行此操作。因此,考慮到當前可用的便攜式O/S接口,不可能有便攜式解決方案。您必須制定一些更高級別的方法,爲開放位提供單一訪問點。這就像鎖文件。 – tchrist