Perfil de usuario y directorio para el juego

La mayoría de las aplicaciones (no solo juegos) necesita un lugar donde guardar al configuración personalizada y datos para cada usuario. La solución óptima es hacerlo en el directorio home o perfil, para los amigos Windows. Gracias a Engel, ya tenemos eso funcionando en Win y hoy logré completar la parte Linux.
Para Windows, el código para obtener el camino al perfil del usuario quedaría de la siguiente forma:

    std::string dir;
    char AppDir[MAX_PATH+1] = {'\0'};
    ITEMIDLIST* pidl;
    HRESULT hRes = SHGetSpecialFolderLocation( NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE , &pidl );
    if (hRes==NOERROR)
    {
      SHGetPathFromIDList( pidl, AppDir );
    }
    dir = std::string(AppDir) + "/TheArk/";
    if(_mkdir(dir.c_str()) != 0){
        // "already exists" error is fine, else we failed.
        errno_t err;
        _get_errno(&err);
        if( err != EEXIST)
            throw std::exception(("Could not create directory "+dir).c_str());
    }
    return dir;


En Linux, así:


    std::string dir;
    char *homeDir=(char*)malloc(64);
    int err;
    homeDir = getenv("HOME");
    dir = std::string(homeDir) + "/.ark/";
   
    if(mkdir(dir.c_str(),S_IRUSR | S_IWUSR | S_IXUSR) != 0){
        // "already exists" error is fine, else we failed.       
        if( errno != EEXIST)
            throw std::exception();
    }
    return dir;


Un detalle, el método getenv también funciona en Windows, y devuelve el camino al perfil del usuario. Se aceptan sugerencias!

Comentarios

  1. Fijate, al leer mi codigo en tu blog me di cuenta de que hay que cambiar algo: si la funcion inicial falla, no debe ejecutar el resto. En lo de getenv("APPDATA"), eso funcionaria probablemente casi siempre, pero segun he leido no hay garantia de que esa variable exista en todas las versiones de Windows, mientras que usar la function de Windows supuestamente debe funcionar siempre.

    ResponderEliminar

Publicar un comentario