2010-05-11 16 views

Respuesta

16

Un identificador de archivo puede que ni siquiera esté conectado a un archivo sino a un conector de red o un conducto 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, , p.,

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

Gracias. No es lo que quería escuchar, sino la solución más eficiente. –

+0

@ sh-beta ¡De nada! Espero que ayude. –

5

Puede llamar stat o IO::Handle::stat en un gestor de archivo - que le dará el dispositivo y i-nodo 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 encontrar un archivo con un número de i-nodo especificado. Probablemente, esto no será tan eficiente como almacenar en caché la ruta al abrir el archivo, como lo recomienda gbacon.

+0

También una solución válida, aunque lenta (como usted mencionó). –

6

El que podría estar buscando una mejor manera de encontrar el nombre de archivo de descriptor de gestor de archivo o archivo:

yo preferiría utilizar el hallazgo -inum, si está disponible. O, ¿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"); 
+0

También puede usar 'fileno $ {^ LAST_FH}' si no tiene el manejador de archivos a mano (por ejemplo, está usando '<>'). –

+0

Esto es compatible con Linux, generalmente no compatible con Unix. – tripleee

Cuestiones relacionadas