2010-05-11 130 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

相关问题