94 votos

Obtener nombre de archivo descriptor de archivo en C

Es posible obtener el nombre de archivo de un descriptor de archivo en C?

108voto

bdonlan Puntos 90068

Usted puede utilizar readlink a /proc/self/fd/NNN donde NNN es el descriptor de archivo. Esto le dará el nombre del archivo tal y como estaba cuando se abrió - sin embargo, si el archivo se ha movido o eliminado desde entonces, puede que ya no sea preciso (aunque Linux puede cambia el nombre de la pista en algunos casos). Para verificar, stat el nombre de archivo dado y fstat el df tiene, y asegúrese st_dev y st_ino son los mismos.

Por supuesto, no todos los descriptores de archivo consulte los archivos, y para los que te vea alguna extraña cadenas de texto, tales como pipe:[1538488]. Puesto que todos los nombres de archivo reales serán las rutas absolutas, se puede determinar que estos son bastante fácilmente. Además, como otros han señalado, los archivos pueden tener varios enlaces permanentes apuntando hacia ellos - esto sólo se informe al que se abre con. Si desea encontrar todos los nombres de archivo, usted sólo tiene que recorrer el sistema de archivos entero.

79voto

zneak Puntos 45458

He tenido este problema en Mac OS X. no Tenemos una /proc sistema de archivos virtual, por lo que la solución aceptada no puede trabajar.

Nosotros, en cambio, tienen un F_GETPATH comando para fcntl:

 F_GETPATH          Get the path of the file descriptor Fildes.  The argu-
                    ment must be a buffer of size MAXPATHLEN or greater.

Así que para obtener el archivo asociado a un descriptor de archivo, puede utilizar este fragmento de código:

#include <sys/syslimits.h>
#include <fcntl.h>

char filePath[PATH_MAX];
if (fcntl(fd, F_GETPATH, filePath) != -1)
{
    // do something with the file path
}

Ya que nunca me acuerdo donde, MAXPATHLEN se define, pensé PATH_MAX de syslimits estaría bien.

23voto

Martin v. Löwis Puntos 61768

En Windows, con GetFileInformationByHandleEx, pasando FileNameInfo, puede recuperar el nombre de archivo.

15voto

Alex Martelli Puntos 330805

Como Tyler señala, no hay manera de hacer lo que usted requiere "directamente y fiable", ya que un determinado FD puede corresponder a 0 nombres de archivo (en varios casos) o > 1 (múltiples "vínculos fuertes", es como la última situación es generalmente descrito). Si usted todavía necesita la funcionalidad con todas las limitaciones (en la velocidad Y en la posibilidad de obtener 0, 2, ... resultados en lugar de 1), aquí es cómo usted puede hacerlo: en primer lugar, fstat el FD -- esto indica que, en el resultando struct stat, lo que el dispositivo de los archivos vidas, ¿cuántos enlaces duros que tiene, si es un archivo especial, etc. Esto ya puede responder a su pregunta-por ejemplo, si 0 enlaces duros usted SABE que hay en el hecho de que no correspondan a ningún nombre de archivo en el disco.

Si las estadísticas le dan la esperanza, entonces usted tiene que caminar "por el árbol de directorios en el dispositivo correspondiente hasta encontrar todos los enlaces duros (o sólo la primera, si no necesitas más de uno, y nadie va a hacer). Para ese propósito, se utiliza readdir (y opendir &c de curso) de forma recursiva la apertura de subdirectorios hasta que usted encuentra en struct dirent así recibió el mismo número de inodo que había en el original struct stat (momento en el que si usted desea toda la ruta, en lugar de sólo el nombre, tendrás que caminar a la cadena de directorios hacia atrás para reconstruir).

Si este enfoque general es aceptable, pero se necesita más detallada de código C, háganoslo saber, no va a ser difícil escribir (aunque yo prefiero no escribir si es inútil, es decir, no puede soportar la inevitable rendimiento lento o la posibilidad de llegar != 1 resultado para los fines de su aplicación;-).

8voto

Duck Puntos 17054

Antes de escribir esto como imposible yo sugiero que busque en el código fuente de la lsof comando.

Puede haber restricciones pero lsof parece capaz de determinar el descriptor de archivo y nombre de archivo. Esta información existe en el sistema de archivos /proc, así que debe ser posible obtener a partir de su programa.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X