c++ - ¿Qué es una forma multiplataforma para obtener el directorio actual?
cross-platform getcwd (3)
Llamar a Opengroup con un puntero NULL se define como la implementación. A menudo hace la asignación por usted con malloc (en cuyo caso su código tiene una pérdida de memoria). Sin embargo, no se garantiza que funcione en absoluto. Así que deberías asignar tu propio búfer.
char *cwd_buffer = malloc(sizeof(char) * max_path_len);
char *cwd_result = getcwd(cwd_buffer, max_path_len);
Open Group tiene un ejemplo que muestra cómo obtener la longitud máxima de ruta de acceso de _PC_PATH_MAX. Podría considerar el uso de MAX_PATH en Windows. Vea esta pregunta para advertencias sobre este número en ambas plataformas.
Necesito una forma multiplataforma para obtener el directorio de trabajo actual (sí, getcwd hace lo que quiero). Pensé que esto podría hacer el truco:
#ifdef _WIN32
#include <direct.h>
#define getcwd _getcwd // stupid MSFT "deprecation" warning
#elif
#include <unistd.h>
#endif
#include <string>
#include <iostream>
using namespace std;
int main()
{
string s_cwd(getcwd(NULL,0));
cout << "CWD is: " << s_cwd << endl;
}
Tengo esta lectura:
No debería haber fugas de memoria, y también debería funcionar en una Mac, ¿correcto?
ACTUALIZACIÓN: Me temo que algo todavía está mal aquí (estoy tratando de evitar crear una matriz de caracteres con una longitud determinada, ya que no hay una forma adecuada de obtener una longitud decente para getcwd):
char* a_cwd = getcwd(NULL,0);
string s_cwd(a_cwd);
free(a_cwd); // or delete a_cwd?
No puede llamar a getcwd
con un búfer NULL. Según el Opengroup :
Si buf es un puntero nulo, el comportamiento de getcwd () no está especificado.
Además, getcwd puede devolver NULL que puede romper un constructor de cadena.
Tendrá que cambiar eso a algo como:
char buffer[SIZE];
char *answer = getcwd(buffer, sizeof(buffer));
string s_cwd;
if (answer)
{
s_cwd = answer;
}
Si no es un problema para usted incluirlo, use el sistema de archivos boost para las operaciones convenientes del sistema de archivos multiplataforma.
boost::filesystem::path full_path( boost::filesystem::current_path() );
Aquí hay un example .
EDITAR: como lo señaló Roi Danton en los comentarios, el sistema de archivos se convirtió en parte de la norma ISO C ++ en C ++ 17 , por lo que ya no es necesario impulsar:
std::filesystem::current_path();