es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C++: Cómo obtener la ruta actual de la carpeta cuando la ruta contiene nombres de carpetas especiales.

Estoy tratando de encontrar una forma de convertir una ruta como esta: “%APPDATA%\xyz\Logs\Archive” a esta: “C:\Users\abcUser\AppData\Roaming\xyz\Logs\Archive”.

Estoy en la plataforma de Windows. Utilizo el conjunto de caracteres Unicode. Puedo usar C++17 si es necesario. Puedo usar las bibliotecas de boost si es necesario.

En mi búsqueda hasta ahora, me encontré con la función “SHGetKnownFolderPath()” que se encuentra en la siguiente referencia: SHGetKnownFolderPath(). Y hay referencias en StackOverflow que explican cómo resolver “%APPDATA%” a su ruta real:

https://stackoverflow.com/questions/2899013/

https://stackoverflow.com/questions/63694092/

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para convertir una ruta como "%APPDATA%\xyz\Logs\Archive" a "C:\Users\abcUser\AppData\Roaming\xyz\Logs\Archive" en Windows utilizando C++17, podemos utilizar la función SHGetKnownFolderPath() de la API de Windows. Esta función recupera la ruta de una carpeta conocida identificada por su valor KNOWNFOLDERID, que incluye la carpeta %APPDATA%.

    Para resolver %APPDATA% a su ruta actual, podemos utilizar el valor FOLDERID_RoamingAppData para el parámetro KNOWNFOLDERID de la función SHGetKnownFolderPath(). Esto devolverá la ruta de la carpeta AppData\Roaming para el usuario actual.

    Luego podemos reemplazar la parte %APPDATA% de la ruta original con la ruta de la carpeta AppData\Roaming resuelta para obtener la ruta deseada.

    Aquí hay un ejemplo de fragmento de código en C++ utilizando SHGetKnownFolderPath() y boost::replace_all() de la biblioteca boost para realizar la conversión de la ruta:

    #include <windows.h> // para SHGetKnownFolderPath
    #include <shlobj_core.h> // para KNOWNFOLDERID, SHGetKnownFolderPath
    #include <boost algorithm/string.hpp=""> // para boost::replace_all
    
    int main()
    {
        wchar_t* appDataPath = nullptr;
        KNOWNFOLDERID appDataFolder = FOLDERID_RoamingAppData;
    
        if (SUCCEEDED(SHGetKnownFolderPath(&appDataFolder, 0, nullptr, &appDataPath)))
        {
            // convertir wide char a string para boost::replace_all
            std::wstring appDataPathStr(appDataPath);
    
            // ruta original
            std::string path = "%APPDATA%\\xyz\\Logs\\Archive";
    
            // reemplazar %APPDATA% con appDataPath
            boost::replace_all(path, "%APPDATA%", appDataPathStr);
    
            // imprimir la ruta convertida
            std::cout << path << std::endl;
    
            // liberar la memoria asignada por SHGetKnownFolderPath
            CoTaskMemFree(appDataPath);
        }
    
        return 0;
    }
    

    Este código debería imprimir C:\Users\abcUser\AppData\Roaming\xyz\Logs\Archive como la ruta convertida.</shlobj_core.h></windows.h>

Comments are closed.