【问题标题】:Can I find a filename from a filehandle in Perl?我可以从 Perl 的文件句柄中找到文件名吗?
【发布时间】:2010-05-11 17:48:47
【问题描述】:
open(my $fh, '>', $path) || die $!;
my_sub($fh);

my_sub() 能否以某种方式从 $fh 推断出 $path?

【问题讨论】:

    标签: perl filenames filehandle


    【解决方案1】:

    文件句柄甚至可能不连接到文件,而是连接到网络套接字或挂接到子进程标准输出的管道。

    如果要将句柄与代码打开的路径相关联,请使用哈希和 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};
    }
    

    【讨论】:

    • 谢谢。不是我想听到的,而是更有效的解决方法。
    【解决方案2】:

    谁可能正在寻找从文件句柄或文件描述符中查找文件名的更好方法:

    如果可用,我更喜欢使用 find -inum 。 或者,如何始终使用以下方式 - 除了 unix/linux 兼容之外的任何缺点!

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

    【讨论】:

    • 如果您手边没有文件句柄,也可以使用fileno ${^LAST_FH}(例如,您使用的是&lt;&gt;)。
    • 这是 Linux 兼容的,一般不兼容 Unix。
    【解决方案3】:

    您可以在文件句柄上调用statIO::Handle::stat——这将为您提供已打开文件的设备和inode。有了它和一点操作系统向导,您就可以找到文件名。好吧,也许有很多操作系统魔法。


    find 命令有一个-inum 选项来查找具有指定inode 号的文件。这可能不如 gbacon 建议的那样在打开文件时缓存路径有效。

    【讨论】:

      猜你喜欢
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 2015-04-13
      • 2012-08-14
      相关资源
      最近更新 更多