open(my $fh, '>', $path) || die $!;
my_sub($fh);
my_sub()能以某种方式从$ fh推断$ path吗?
答案 0 :(得分: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};
}
答案 1 :(得分:7)
谁可能正在寻找更好的方法从文件句柄或文件描述符中找到文件名:
我更愿意使用find -inum(如果有的话)。 或者,如何使用以下方式,总是 - 除了unix / linux兼容之外的任何缺点!
my $filename='/tmp/tmp.txt';
open my $fh, '>', $filename;
my $fd = fileno $fh;
print readlink("/proc/$$/fd/$fd");
答案 2 :(得分:6)
您可以在文件句柄上调用stat
或IO::Handle::stat
- 这将为您提供已打开文件的设备和inode。有了这个和一点操作系统的魔法,你可以找到文件名。好的,可能是很多操作系统的魔法。
find
命令有-inum
选项,用于查找具有指定inode编号的文件。正如gbacon建议的那样,这可能不如在打开文件时缓存路径那样高效。