¿Cómo abrir una carpeta en %appdata% con C++?

4 minutos de lectura

Como todos saben, la carpeta appdata es esta

 C:Users*Username*AppDataRoaming

en ventanas 7

Dado que mi aplicación se implementará en todo tipo de sistemas operativos Windows, necesito poder obtener la carpeta el 100% del tiempo. La pregunta es ¿cómo lo haces en C++? Como no conozco el sistema operativo Windows exacto, podría ser XP, Vista o 7 y, lo que es más importante, no sé cuál es el Nombre de usuario es.

  • Posible duplicado: stackoverflow.com/questions/3964124/…

    – razlebe

    07 may. 11 en 11:57


  • Eso está en C, estoy pidiendo C++

    – dikidera

    07 may.

Para obtener la máxima compatibilidad con todas las versiones de Windows, puede utilizar el SHGetFolderPath función.
Requiere que especifique el CSIDL valor para la carpeta cuya ruta desea recuperar. Para la carpeta de datos de la aplicación, eso sería CSIDL_APPDATA.

En Windows Vista y versiones posteriores, debe usar el SHGetKnownFolderPath función en su lugar, lo que requiere que especifique la carpeta KNOWNFOLDERID valor. Nuevamente, para la carpeta de datos de la aplicación, el valor apropiado es FOLDERID_RoamingAppData.

Para usar cualquiera de estas funciones desde su aplicación C++, deberá incluir shlobj.h.

  • ¿Cuál recomiendas?

    – dikidera

    07 may. 11 en 12:29

  • @mfce: Uh, el primero es lo que debe usar en versiones de Windows anteriores a Vista (como Windows 2000 y XP). Sin embargo, ha quedado obsoleto a partir de Windows Vista, y las nuevas aplicaciones escritas para Vista y 7 siempre deben usar la segunda. Por lo tanto, depende de la versión de Windows en la que se esté ejecutando el programa.

    – Cody gris

    07 may. 11 en 12:30

  • Está dirigido a ambos.

    – dikidera

    07 may. 11 en 12:51

  • @mcfe: Está bien… Entonces necesitarás un if declaración. Determine con qué versión de Windows se está ejecutando el programa y llame a la función adecuada. Tendrás que usar LoadLibrary y GetProcAddress por SHGetKnownFolderPathya que no está definido para versiones anteriores a XP.

    – Cody gris

    07 may. 11 en 12:57

¿Cómo abrir una carpeta en %appdata% con C++?
iptq

Puedes intentar lo siguiente:

char* appdata = getenv("APPDATA");

Este código lee la variable de entorno APPDATA (también puede verla cuando escribe SET en una ventana de comandos). Lo establece Windows cuando se inicia el sistema.

Devolverá la ruta del usuario. appdata como un camino absoluto, incluyendo Nombre de usuario y teniendo en cuenta la versión del sistema operativo que estén usando.

  • Para aquellos que sienten curiosidad, esto no funcionará en XP ya que appdata no es una variable de entorno reconocida. Sin embargo, los archivos de programa funcionarán.

    – NinjaMid76

    29 sep.

  • con los años getenv quedó en desuso, y ahora se recomienda usar el más seguro _dupenv_s

    – itsho

    07 mar. 21 a las 21:00

Quizás a los compañeros de Google les resulte interesante echar un vistazo a std::filesystem. Por ejemplo, asumamos la ubicación predeterminada del directorio temporal y la estructura del directorio AppData en Windows 10:

#include <filesystem>

auto path = std::filesystem::temp_directory_path()
    .parent_path()
    .parent_path();

path /= "Roaming";

if (!std::filesystem::exists(path))
    std::filesystem::create_directories(path);

En el caso de OP, supongo que esto no resuelve el problema. Quiero hacer una advertencia en contra de hacer lo anterior en una situación que requiere una implementación 100% sólida, ya que las configuraciones del sistema pueden cambiar fácilmente y romper lo anterior.

Pero quizás los nuevos visitantes de la pregunta puedan encontrar útil std::filesystem. Lo más probable es que desee manipular los elementos en el directorio si lo está buscando, y para esto, std::filesystem puede ser su amigo.

  • Nota: std::filesystem solo está disponible desde C++17

    – M_N1

    10 ago. 2020 a las 08:40

¿Cómo abrir una carpeta en %appdata% con C++?
Phil Loctaux

Si alguien está buscando una implementación simple, aquí está la mía:

#include <windows.h>
#include <shlobj.h>

#include <filesystem>
#include <iostream>

int main(void)
{
    std::filesystem::path path;
    PWSTR path_tmp;

    /* Attempt to get user's AppData folder
     *
     * Microsoft Docs:
     * https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetknownfolderpath
     * https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid
     */
    auto get_folder_path_ret = SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &path_tmp);

    /* Error check */
    if (get_folder_path_ret != S_OK) {
        CoTaskMemFree(path_tmp);
        return 1;
    }

    /* Convert the Windows path type to a C++ path */
    path = path_tmp;

    /* Free memory :) */
    CoTaskMemFree(path_tmp);

    std::cout << path << std::endl;

    return 0;
}

¿Cómo abrir una carpeta en %appdata% con C++?
Akash das

Use este código para leer la variable de entorno “APPDATA”
Incluir el archivo stdio.h al principio

char *pValue;
size_t len;
errno_t err = _dupenv_s(&pValue, &len, "APPDATA");

ingrese la descripción de la imagen aquí

¿Cómo abrir una carpeta en %appdata% con C++?
PJ127

Aquí hay una implementación simple para versiones antiguas de C ++:

#include <shlobj.h>
// ...
wchar_t* localAppDataFolder;
if (SHGetKnownFolderPath(FOLDERID_LocalAppData, KF_FLAG_CREATE, NULL, &localAppDataFolder) != S_OK) {
    std::cerr << "problem getting appdata folder" << std::endl;
}
else std::wcout << L"folder found: " << localAppDataFolder << std::endl;

.

¿Ha sido útil esta solución?