Могу ли я найти имя файла из дескриптора файла в Perl?
open(my $fh, '>', $path) || die $!;
my_sub($fh);
Может ли my_sub() каким-то образом экстраполировать $path из $fh?
Ответ 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");
Ответ 3
Вы можете вызвать stat или IO::Handle::stat на дескрипторе файла - это даст вам устройство и inode файла, который вы открыли. С этим и небольшим волшебством операционной системы вы можете найти имя файла. Хорошо, может быть, много волшебства операционной системы.
Команда find имеет параметр -inum, чтобы найти файл с указанным номером inode. Вероятно, это будет не так эффективно, как кеширование пути при открытии файла, как рекомендует gbacon.