¿Cómo obtener el directorio actual en un programa en C?
-
08-07-2019 - |
Pregunta
Estoy haciendo un programa en C donde necesito obtener el directorio desde el que se inicia el programa. Este programa está escrito para computadoras UNIX. He estado mirando opendir ()
y telldir ()
, pero telldir ()
devuelve un off_t (long int)
, por lo que realmente no me ayuda.
¿Cómo puedo obtener la ruta actual en una cadena (matriz de caracteres)?
Solución
¿Ha echado un vistazo a getcwd ()
?
#include <unistd.h>
char *getcwd(char *buf, size_t size);
Ejemplo simple:
#include <unistd.h>
#include <stdio.h>
#include <limits.h>
int main() {
char cwd[PATH_MAX];
if (getcwd(cwd, sizeof(cwd)) != NULL) {
printf("Current working dir: %s\n", cwd);
} else {
perror("getcwd() error");
return 1;
}
return 0;
}
Otros consejos
Busque la página de manual para getcwd
.
Aunque la pregunta está etiquetada como Unix, las personas también pueden visitarla cuando su plataforma de destino es Windows, y la respuesta para Windows es GetCurrentDirectory ()
función:
DWORD WINAPI GetCurrentDirectory(
_In_ DWORD nBufferLength,
_Out_ LPTSTR lpBuffer
);
Estas respuestas se aplican a los códigos C y C ++.
Enlace sugerido por user4581301 en un comment a otra pregunta, y se verificó como la mejor opción actual con un sitio de búsqueda de Google : microsoft.com getcurrentdirectory '.
#include <stdio.h> /* defines FILENAME_MAX */
//#define WINDOWS /* uncomment this line to use it for windows.*/
#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif
int main(){
char buff[FILENAME_MAX];
GetCurrentDir( buff, FILENAME_MAX );
printf("Current working dir: %s\n", buff);
return 1;
}
Tenga en cuenta que getcwd (3)
también está disponible en la biblioteca de Microsoft: getcwd (3) , y funciona de la misma manera que cabría esperar.
Debe vincularse con -loldnames
(oldnames.lib, que se realiza automáticamente en la mayoría de los casos), o usar _getcwd ()
. La versión no prefijada no está disponible en Windows RT.