perl filenames filehandle

¿Puedo encontrar un nombre de archivo de Filehandle en Perl?



filenames (3)

Es posible que un identificador de archivo ni siquiera esté conectado a un archivo, sino a un socket de red o un enlace conectado a la salida estándar de un proceso hijo.

Si desea asociar identificadores con las rutas que abre su código, use un hash y el operador fileno , por ejemplo ,

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}; }

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

¿Puede my_sub () extrapolar de alguna manera $ path desde $ fh?


Puede invocar stat o IO::Handle::stat en un identificador de archivo, que le proporcionará el dispositivo y el inode del archivo que ha abierto. Con eso y un poco de magia del sistema operativo, puedes encontrar el nombre del archivo. OK, tal vez una gran cantidad de magia del sistema operativo.

El comando find tiene una opción -inum para buscar un archivo con un número de inodo especificado. Probablemente, esto no será tan eficiente como almacenar en caché la ruta al abrir el archivo, como lo recomienda gbacon.


Quien esté buscando una forma mejor de encontrar el nombre de archivo desde Filehandle o el descriptor de archivo:

Preferiría usar la búsqueda -inum, si está disponible. O bien, ¿qué tal el uso de la siguiente manera, siempre - cualquier inconveniente excepto el compatible con unix / linux!

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