Implementar la función realpath() en C++

Jay Shaw 12 octubre 2023
  1. Implementar la función realpath() en C++
  2. Encuentre la ruta absoluta usando la función realpath() en C++
  3. Use el comando de una línea para encontrar la ruta absoluta usando la función realpath() en C++
  4. Conclusión
Implementar la función realpath() en C++

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 \).

  1. Abra el editor de texto en cualquier distribución de Linux con la extensión .cpp.

  2. El programa tiene cinco archivos de importación: limits.h para incluir la subfunción PATH_MAX, stdio para funciones de entrada-salida, stdlib, string para funciones de cadena, cerrno para casos de error .

  3. Dentro de la función main, se crea una variable: una matriz de caracteres buffer[] con un tamaño establecido como PATH_MAX. Usar PATH_MAX es una mejor práctica para almacenar nombres de rutas en lugar de solo adivinar.

  4. 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);
    
  5. Si la función realpath() en C++ devuelve correctamente un nombre resuelto, se imprime el valor dentro de la variable buffer.

    if (path) {
      printf("Absolute Path = %s.\n", buffer);
    }
    
  6. Si la función realpath() devuelve un puntero nulo, el programa genera un indicador de error utilizando la función errno.

    char* errStr = strerror(errno);
    

    La función errno es una función miembro de la biblioteca cerrno. Devuelve un código de error numérico, pero usando la función strerror lo convierte en su valor de cadena correspondiente: char* errStr = strerror(errno).

  7. El perror imprime un mensaje de error a stder. La función primero imprime el texto proporcionado entre llaves, seguido del mensaje de error.

    perror("realpath");
    
  8. Por último, el programa sale usando el código de terminación EXIT_FAILURE dentro del bloque else.

    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:

  1. El gcc -o realpath crea una aplicación de salida realpath utilizando el compilador gcc.
  2. El código tiene dos paquetes de librería: stdlib y stdio.
  3. Dentro del método principal, se crean dos variables: una variable entera c y una apuntadora v.
  4. El puts(realpath(v[1],0)) devuelve el literal de cadena devuelto por la función realpath().

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++.