Dada la ruta completa, la API debería darme el nombre de archivo base. Por ejemplo, "/foo/bar.txt" -> "bar.txt".¿Hay alguna API de C para extraer el nombre de archivo base de su ruta completa en Linux?
Respuesta
Hay basename().
Aliméntelo con una ruta (en forma de char*
) y le devolverá el nombre base (que es el nombre del archivo/directorio que desea) en la forma de otro char*
.
EDIT:
me olvidó decir que la versión POSIX de basename()
modifica su argumento. Si se quiere evitar esto, puedes usar la versión GNU de basename()
anteponiendo esto en su fuente:
#define _GNU_SOURCE
#include <string.h>
A cambio de esta versión de basename()
devolverá una cadena vacía si le da de comer con, por ejemplo, /usr/bin/
debido a la barra al final.
¿Quieres nombre base(), que debe estar presente en casi cualquier sistema POSIX-ish:
http://www.opengroup.org/onlinepubs/000095399/functions/basename.html
#include <stdio.h>
#include <libgen.h>
int main() {
char name[] = "/foo/bar.txt";
printf("%s\n", basename(name));
return 0;
}
...
$ gcc test.c
$ ./a.out
bar.txt
$
nombre base es destructivo y provocará una segfault en este caso, intente 'basename ("/foo/bar/")'. – falstro
@roe: En realidad, es posible que se haya producido una falla de seguridad en _este caso. En mi caso, estuvo bien. :) Pero tienes razón, arreglado. –
sí, naturalmente, lo siento. Quise decir que PODRÍA segfault en su caso, suponiendo que el literal de la cadena es algo macro en tiempo de compilación o algo así. El punto es que podría ser destructivo, y estás obligado a hacer una copia de tu cadena. – falstro
#include <string.h>
char *basename(char const *path)
{
char *s = strrchr(path, '/');
if (!s)
return strdup(path);
else:
return strdup(s + 1);
}
No se olvide de liberar el búfer recién asignado: "man strdup" dice: "La memoria para la nueva cadena se obtiene con malloc (3), y se puede liberar con free (3)". Eliminar ":" después de "else". – user2431763
pienso el código C correcto de @ matt-joiner debe ser:
char *basename(char const *path) { char *s = strrchr(path, '/'); if(s==NULL) { return strdup(path); } else { return strdup(s + 1); } }
'! S' es el código C idiomático, en comparación con' s == NULL' que es superfluo. – syockit
- 1. extraer nombre de archivo de la ruta
- 2. Abrir archivo por su ruta completa en C++
- 3. Extraer solo el nombre de archivo Del nombre de FileItem
- 4. creación de nombre de archivo de ruta completa en python,
- 5. Obtener la ruta completa sin el nombre de archivo de la ruta que incluye el nombre de archivo
- 6. ¿Hay alguna tarea de MSBuild que extraiga la ruta dada de un nombre de archivo?
- 7. Buscar nombre de archivo de la ruta de archivo completo
- 8. eliminar ruta completa, mantenga el nombre de archivo solamente
- 9. C#: ¿Hay alguna forma de evitar el límite de 260 caracteres de una ruta completa?
- 10. Devuelve el nombre de archivo sin extensión de la ruta completa en C#
- 11. Extracción de "nombre de archivo" de la ruta completa en actionscript 3
- 12. Parse nombre de archivo de la ruta completa utilizando expresiones regulares en C#
- 13. ¿Cómo extraer el nombre del archivo del nombre de la ruta del archivo?
- 14. Obtener ruta de archivo completa en java
- 15. comando de linux para extraer el archivo de guerra
- 16. búsqueda de nombre de ruta en Linux?
- 17. script de shell para encontrar el nombre de archivo de su ruta
- 18. ¿Usar sed para agarrar el nombre de archivo de la ruta completa?
- 19. md5sum de archivo en Linux C
- 20. Objetivo-C: Extraer nombre de archivo de la cadena de ruta
- 21. Obtener el nombre de archivo de una ruta con Javascript
- 22. Ruta a un archivo sin nombre base
- 23. ¿Cómo obtengo la ruta completa para un argumento de línea de comandos de nombre de archivo?
- 24. ¿Cómo puedo separar una ruta completa en directorio y nombre de archivo?
- 25. ¿Hay algún nombre de archivo de Linux no válido?
- 26. ¿Cómo puedo extraer un nombre de archivo de una ruta usando Perl?
- 27. Directory.GetFiles: cómo obtener solo el nombre de archivo, no la ruta completa?
- 28. Python Glob sin la ruta completa - solo el nombre de archivo
- 29. ¿Copiar/extraer parte de una ruta de archivo?
- 30. ¿Puede un nombre de archivo PHP (o un directorio en su ruta completa) tener caracteres UTF-8?
strdup-ing la ruta de acceso antes de alimentarlo a basename() en su lugar. – 341008
sí, buen punto –