Получить путь к моим документам - PullRequest
14 голосов
/ 10 марта 2010

Как из Visual C ++ получить путь к папке «Мои документы» текущего пользователя?

Edit:

У меня есть это:

TCHAR my_documents[MAX_PATH];
HRESULT result = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, my_documents);

Однако, result возвращается со значением E_INVALIDARG. Есть мысли о том, почему это может быть?

Ответы [ 5 ]

19 голосов
/ 10 марта 2010

Это зависит от того, с какой возрастной системой вам требуется совместимость. Для старых систем есть SHGetSpecialFolderPath . Для более новых систем есть SHGetFolderPath . Начиная с Vista, есть SHGetKnownFolderPath .

Редактировать: Вы хотите использовать CSIDL_PERSONAL, а не CSIDL_MYDOCUMENTS. Демонстрационный код, который работает, по крайней мере, на моей машине:

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

#pragma comment(lib, "shell32.lib")

int main() { 
    CHAR my_documents[MAX_PATH];
    HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, my_documents);

    if (result != S_OK)
        std::cout << "Error: " << result << "\n";
    else
        std::cout << "Path: " << my_documents << "\n";
    return 0;
}
9 голосов
/ 10 марта 2010

Используйте функцию SHGetFolderPath Windows API и запрос CSIDL_MYDOCUMENTS.

1 голос
/ 02 июня 2018

Использование Visual Studio 2017 с приложением MFC под Windows 10 Я использую следующий фрагмент кода с функцией SHGetKnownFolderPath , чтобы получить папку «Документы» текущего пользователя:

#include <string>     // include file for C++ native strings

//  . . .  other code.

PWSTR   ppszPath;    // variable to receive the path memory block pointer.

HRESULT hr = SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &ppszPath);

std::wstring myPath;
if (SUCCEEDED(hr)) {
    myPath = ppszPath;      // make a local copy of the path
}

CoTaskMemFree(ppszPath);    // free up the path memory block

Обратите внимание, чтодокументация может сказать об использовании переменной пути и возвращенном пути:

ppszPath [out]

Тип: PWSTR *

Когда этот метод возвращает, содержитадрес указателя на завершенную нулем строку Unicode, которая указывает путь к известной папке.Вызывающий процесс отвечает за освобождение этого ресурса, когда он больше не нужен, путем вызова CoTaskMemFree.Возвращенный путь не включает в себя обратную косую черту.Например, возвращается «C: \ Users», а не «C: \ Users \».

Список возможных аргументов FOLDERID_ см. В статье MSDN Перечисление KNOWN_FOLDER_FLAG .

1 голос
/ 25 февраля 2015
std::string GetSystemFolderPaths(int csidl)
{
    wchar_t Folder[1024];
    HRESULT hr = SHGetFolderPathW(0, CSIDL_MYDOCUMENTS, 0, 0, Folder);
    if (SUCCEEDED(hr))
    {
        char str[1024];
        wcstombs(str, Folder, 1023);
        return str;
    }
    else return "";
}

cout<<GetSystemFolderPaths(CSIDL_MYDOCUMENTS)<<endl;

как насчет этого решения? Это нормально работает для меня.

1 голос
/ 26 сентября 2012

Обратите внимание, что CSIDL_PERSONAL не вернет нужную папку, если пользователь изменил папку сохранения по умолчанию в библиотеке документов Win7. Чтобы получить нужную папку, вам нужно использовать SHLoadLibraryFromKnownFolder, чтобы получить IShellLibrary для библиотеки документов, используйте IShellLibrary::GetDefaultSaveFolder, чтобы получить IShellItem для папки сохранения библиотеки по умолчанию, и, наконец, используйте IShellItem::GetDisplayName, чтобы получить имя папки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...