Получить путь к моим документам
Из Visual С++, как мне получить путь к папке "Мои документы" текущего пользователя?
Edit:
У меня есть это:
TCHAR my_documents[MAX_PATH];
HRESULT result = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, my_documents);
Однако result
возвращается со значением E_INVALIDARG
. Любые мысли о том, почему это может быть?
Ответы
Ответ 1
Это зависит от того, с какой возрастной системой вам нужна совместимость. Для старых систем есть SHGetSpecialFolderPath. Для несколько более новых систем существует SHGetFolderPath. Начиная с Vista, есть SHGetKnownFolderPath.
Вот некоторый демонстрационный код, который работает, по крайней мере, на моей машине:
#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;
}
Ответ 2
Используйте SHGetFolderPath
функцию Windows API и запросите CSIDL_MYDOCUMENTS
.
Ответ 3
Обратите внимание, что CSIDL_PERSONAL не вернет нужную папку, если пользователь изменил папку сохранения по умолчанию в библиотеке документов Win7. Чтобы получить нужную папку, вам нужно использовать SHLoadLibraryFromKnownFolder
для получения IShellLibrary
для библиотеки документов, используйте IShellLibrary::GetDefaultSaveFolder
, чтобы получить IShellItem
для папки сохранения по умолчанию для библиотеки, и, наконец, используйте IShellItem::GetDisplayName
, чтобы получить имя папки.
Ответ 4
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;
как насчет этого решения? Его работа прекрасна для меня.
Ответ 5
Использование 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_
см. В перечислении статьи MSN KNOWN_FOLDER_FLAG.