Can I find a filename from a filehandle in Perl?

非 Y 不嫁゛ 提交于 2019-11-27 03:09:06

问题


open(my $fh, '>', $path) || die $!;
my_sub($fh);

Can my_sub() somehow extrapolate $path from $fh?


回答1:


A filehandle might not even be connected to a file but instead to a network socket or a pipe hooked to the standard output of a child process.

If you want to associate handles with paths your code opens, use a hash and the fileno operator, e.g.,

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:


Whoever might be looking for better way to find the file name from filehandle or file descriptor:

I would prefer to use the find -inum , if available. Or, how about using following way, always - any drawbacks except the unix/linux compatible!

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



回答3:


You can call stat or IO::Handle::stat on a filehandle -- that will give you the device and inode of the file that you have opened. With that and a little operating system wizardry you can find the filename. OK, maybe a lot of operating system wizardry.


The find command has an -inum option to find a file with a specified inode number. This is probably not going to be as efficient as caching the path when you open the file, as gbacon recommends.



来源:https://stackoverflow.com/questions/2813092/can-i-find-a-filename-from-a-filehandle-in-perl

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!