Implementar la función realpath() en C++
-
Implementar la función
realpath()
en C++ -
Encuentre la ruta absoluta usando la función
realpath()
en C++ -
Use el comando de una línea para encontrar la ruta absoluta usando la función
realpath()
en C++ - Conclusión
La función realpath()
se documentó por primera vez en POSIX 1997 y POSIX 2008 como una función para encontrar la ruta absoluta de un archivo dentro de un directorio.
Este artículo explica la implementación de la función realpath()
en C++. Se puede implementar en el sistema para encontrar la ruta absoluta de un archivo usando C++.
Implementar la función realpath()
en C++
El uso principal de realpath()
en C++ es encontrar la ruta de acceso de un archivo cuando se resuelven todos sus enlaces simbólicos.
Antes de discutir la implementación de realpath()
en C++, aquí hay algunos conceptos básicos que deben conocerse:
- Enlace simbólico: un enlace simbólico apunta a su archivo de destino, pero es diferente a un acceso directo, ya que la computadora trata el enlace simbólico como un archivo en sí mismo en lugar de un enlace al archivo de destino. Actúa como un tipo de archivo que, cuando se accede, lleva al usuario a la ubicación donde existe el archivo original, y cualquier cambio realizado en el enlace simbólico también se refleja en el archivo original.
- Ruta absoluta: cuando la ruta a un archivo se escribe en su directorio raíz, como
\usr\bin\main
, se conoce como su ruta absoluta. - Ruta relativa: si el directorio de trabajo actual se establece como
usr\bin
, entonces el archivo cuya ruta absoluta es/usr/bin/main
puede referenciarse simplemente como principal. Por ejemplo, el comando UNIX:cp /usr/bin/main /usr/bin/main.bak
y el comando:cp mailbox mailbox.bak
logran lo mismo si el directorio de trabajo es/usr/ast
.
El nombre de ruta encontrado por la función realpath()
en C++ no es necesariamente absoluto si el valor proporcionado es un nombre relativo, pero eso también depende de si algún enlace simbólico se atraviesa con nombres absolutos para el valor del enlace. Si lo hace, entonces la salida es un nombre absoluto.
Encuentre la ruta absoluta usando la función realpath()
en C++
Vamos a crear un programa que encuentre la ruta absoluta de un archivo usando realpath()
en C++. Este ejemplo se muestra en Linux (en Windows, el separador es \
).
-
Abra el editor de texto en cualquier distribución de Linux con la extensión
.cpp
. -
El programa tiene cinco archivos de importación:
limits.h
para incluir la subfunciónPATH_MAX
,stdio
para funciones de entrada-salida,stdlib
,string
para funciones de cadena,cerrno
para casos de error . -
Dentro de la función
main
, se crea una variable: una matriz de caracteresbuffer[]
con un tamaño establecido comoPATH_MAX
. UsarPATH_MAX
es una mejor práctica para almacenar nombres de rutas en lugar de solo adivinar. -
realpath()
en C++ toma dos parámetros: nombre de archivo y nombre resuelto. Devuelve un puntero al nombre resuelto; de lo contrario, se devuelve un indicador de error.char *path = realpath("test.py", buffer);
-
Si la función
realpath()
en C++ devuelve correctamente un nombre resuelto, se imprime el valor dentro de la variablebuffer
.if (path) { printf("Absolute Path = %s.\n", buffer); }
-
Si la función
realpath()
devuelve un puntero nulo, el programa genera un indicador de error utilizando la funciónerrno
.char* errStr = strerror(errno);
La función
errno
es una función miembro de la bibliotecacerrno
. Devuelve un código de error numérico, pero usando la funciónstrerror
lo convierte en su valor de cadena correspondiente:char* errStr = strerror(errno)
. -
El
perror
imprime un mensaje de error astder
. La función primero imprime el texto proporcionado entre llaves, seguido del mensaje de error.perror("realpath");
-
Por último, el programa sale usando el código de terminación
EXIT_FAILURE
dentro del bloqueelse
.exit(EXIT_FAILURE);
Código:
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cerrno>
int main(void) {
char buffer[PATH_MAX];
char* path = realpath("test.py", buffer);
if (path) { // or: if (path != NULL)
printf("Absolute Path = %s.\n", buffer);
} else {
char* errStr = strerror(errno);
printf("String Error: %s\n", errStr);
perror("realpath");
exit(EXIT_FAILURE);
}
return 0;
}
Compilacion:
Como el código está escrito en Linux, debe compilarse usando la terminal. Guarda el archivo de texto en el que está escrito el código con un nombre apropiado (ej: C-realpath
) y con la extensión .cpp
.
El archivo se compilará utilizando el compilador gcc
y se creará una nueva aplicación para ejecutar el código.
Utilice la siguiente sintaxis:
gcc -o realpath2 C-realpath.cpp
La sintaxis anterior compilará con éxito el código a menos que haya algunos errores. Una vez compilado, el compilador crea una aplicación de salida - realpath2
para nuestro código.
Para ejecutar la aplicación, escriba la sintaxis:
./realpath2
Producción :
jay@jay-virtual-machine:~$ gcc -o realpath2 C-realpath.cpp
jay@jay-virtual-machine:~$ ./realpath2
Absolute Path = /home/jay/test.py.
Como el archivo test.py
existe en el sistema, el programa imprime su ruta absoluta.
En caso de que se proporcione un nombre incorrecto para el archivo, o si falta el archivo, la aplicación imprime el código de error:
jay@jay-virtual-machine:~$ ./realpath2
String Error: No such file or directory
realpath: No such file or directory
Use el comando de una línea para encontrar la ruta absoluta usando la función realpath()
en C++
La función realpath()
en C++ también se puede implementar mediante comandos de una sola línea en Linux. Esto evita que el programador cree archivos de texto para escribir código y compilarlos por separado.
Para compilar el código, escriba la siguiente sintaxis dentro de la terminal:
gcc -o realpath -x c - <<< $'#include<stdlib.h>\n#include<stdio.h>\nint main(int c,char**v){puts(realpath(v[1],0));}'
Lo que hace el código:
- El
gcc -o realpath
crea una aplicación de salidarealpath
utilizando el compiladorgcc
. - El código tiene dos paquetes de librería:
stdlib
ystdio
. - Dentro del método
principal
, se crean dos variables: una variable enterac
y una apuntadorav
. - El
puts(realpath(v[1],0))
devuelve el literal de cadena devuelto por la funciónrealpath()
.
Se debe proporcionar un nombre de archivo o ruta a la aplicación de salida ruta real
para generar una salida. En este ejemplo, una carpeta dentro del sistema de archivos se pasa a la aplicación y devuelve la ruta absoluta del archivo.
Producción :
jay@jay-virtual-machine:~$ ./realpath snap
/home/jay/snap
Como no hay una excepción de error dentro del código, en caso de que falte un archivo en la entrada, arroja errores:
jay@jay-virtual-machine:~$ ./realpath vid
Segmentation fault (core dumped)
Conclusión
Este artículo explica cómo implementar la función realpath()
en C++ para encontrar la ruta absoluta de un archivo. Después de leer el artículo, el lector puede derivar la ruta absoluta de los archivos utilizando realpath()
en C++.