2012-05-30 126 views
6

鑑於文件的名稱,如何確定文件當前是打開還是正在使用? (我正在談論文件而不是Perl文件句柄。)如何檢查一個文件是否使用Perl打開?

請注意,我正在尋找一種通用的Perl解決方案,而不是特定於操作系統的解決方案。至少,我希望能夠在Windows和基於GNU/Linux的系統上運行。

+0

重複的http://stackoverflow.com/questions/520196/how-can-i-check-if-a-filehandle-is-open-in-perl – cppcoder

+0

@cppcoder:你提到的問題似乎關於正在打開的文件句柄。我在談論這個問題中的文件。 – Sam

+0

POSIX不提供任何方式來執行此操作。因此,考慮到當前可用的便攜式O/S接口,不可能有便攜式解決方案。您必須制定一些更高級別的方法,爲開放位提供單一訪問點。這就像鎖文件。 – tchrist

回答

3

POSIX不提供任何方式來執行此操作。因此,考慮到當前可用的便攜式O/S接口,不可能有便攜式解決方案。

你必須制定一些更高層次的方法,爲開放位提供單一訪問點。這就像鎖文件。

1

請參見下面的代碼片段(僅限於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 
+0

這可能是一個在基於Unix的系統上完成它的好方法。不過,我正在使用Windows。不依賴於操作系統的通用解決方案將會很好。 – Sam

+0

有一個perl模塊:http://search.cpan.org/~marcb/Unix-Lsof-0.0.9/lib/Unix/Lsof.pm,但只適用於Unix和Unix喜歡。也許使用'cygwin'可以幫助那裏。 –

+0

還有http://search.cpan.org/~rjbs/perl-5.16.0/ext/Fcntl/Fcntl.pm – flesk

0

試試Scalar::Util

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 
+0

我看了一下這個功能,但似乎沒有解決這個問題。但是,我可能根本不知道如何使用該函數來完成我所要求的功能。 – Sam

+0

是的,抱歉,錯誤的答案。 我想你必須從win32 api中尋找Windows特定的文件打開功能。 – Sly

0

試試這個

use strict; 
open(IN, ">test"); 
print IN "Hello"; 
close(IN); 
if(fileno(IN) == undef) 
{ 
    print "File is CLOSED\n"; 
} 
+0

我在問文件而不是文件句柄。 – Sam

-1

我知道你不不想打開文件句柄,但它可能是最簡單的方法IMO:

open my $myfh, '<', $my_file or die "Couldn't open $my_file: $!"; 
+0

我認爲你通常可以在閱讀模式下打開文件,即使它們已經在其他地方打開了。 – Sam

0

我知道它已經有一段時間了,但對於Windows我有一些相當不錯的運氣,通過試圖鎖定文件來檢測文件正在被寫入(沒有什麼奇特的 - 只是打開閱讀,使用Perl內部羣並關閉文件)。這似乎甚至可以在網絡文件上工作。我不確定這是否適用於Linux(可能會寫入),但我不知道它是否可以檢測到其他文件讀取器。