2010-05-11 125 views

回答

16

文件句柄甚至可能不會連接到文件,而是連接到網絡套接字或連接到子進程的標準輸出的管道。

如果要將句柄與代碼打開的路徑相關聯,請使用散列並使用fileno運算符,例如

my %fileno2path; 

sub myopen { 
    my($path) = @_; 

    open my $fh, "<", $path or die "$0: open: $!"; 

    $fileno2path{fileno $fh} = $path; 
    $fh; 
} 

sub myclose { 
    my($fh) = @_; 
    delete $fileno2path{fileno $fh}; 
    close $fh or warn "$0: close: $!"; 
} 

sub path { 
    my($fh) = @_; 
    $fileno2path{fileno $fh}; 
} 
+0

謝謝。不是我想聽到的,而是更有效的解決方法。 – 2010-05-12 21:34:13

+0

@ sh-beta不客氣!我希望它有幫助。 – 2010-05-12 21:35:17

5

您可以在一個文件句柄調用statIO::Handle::stat - 它將使你,你已經打開的文件的設備和節點。有了這個和一個小操作系統的巫術,你可以找到文件名。好的,也許有很多操作系統的魔力。


find命令有一個-inum選項查找指定索引節點號的文件。正如gbacon的建議,這可能不會像打開文件時緩存路徑那樣高效。

+0

也是一個有效的解決方法,雖然很慢(如您所述)。 – 2010-05-12 21:35:06

6

誰可能會尋找更好的方法來從文件句柄或文件描述符查找的文件名:

我寧願如果有使用find -inum。 或者,如何使用以下方式,總是 - 除unix/linux兼容以外的任何缺點!

my $filename='/tmp/tmp.txt'; 
open my $fh, '>', $filename; 
my $fd = fileno $fh; 
print readlink("/proc/$$/fd/$fd"); 
+0

如果你沒有文件句柄,你也可以使用'fileno $ {^ LAST_FH}'(例如你使用'<>')。 – 2014-12-16 01:03:51

+0

這是Linux兼容的,通常不是Unix兼容的。 – tripleee 2017-12-21 13:18:11

相關問題