2010-03-10 15 views
10

Od Visual C++, w jaki sposób uzyskać ścieżkę do folderu Moje dokumenty bieżącego użytkownika?Uzyskaj ścieżkę do Moich dokumentów

Edit:

mam to:

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

Jednak result wraca o wartości E_INVALIDARG. Wszelkie przemyślenia, dlaczego tak się dzieje?

Odpowiedz

14

To zależy od tego, ile lat system wymaga kompatybilności. W przypadku starych systemów istnieje SHGetSpecialFolderPath. W przypadku nieco nowszych systemów istnieje SHGetFolderPath. Począwszy od wersji Vista, jest SHGetKnownFolderPath.

Edytuj: chcesz użyć CSIDL_PERSONAL, a nie CSIDL_MYDOCUMENTS. Demo kod, który działa, przynajmniej na moim komputerze:

#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; 
} 
+0

Dzięki - Próbowałem SHGetFolderPath, a coś nie działało - czy mógłbyś spojrzeć na moją edycję w pytaniu? – Smashery

+0

Dziękuję bardzo! – Smashery

+0

To wydaje się być teraz wbudowanym pytonem. http://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path – totowtwo

8

Użyj the SHGetFolderPath Windows API function i zamów CSIDL_MYDOCUMENTS.

+0

Myślę, że link jest nieprawidłowy, napraw: http://msdn.microsoft.com/en-us/library/bb762181%28VS.85%29.aspx – uray

+0

Dzięki - próbowałem tego, a coś nie jest do końca działa - czy mógłbyś spojrzeć na moją edycję w pytaniu? – Smashery

1

Zauważ, że CSIDL_PERSONAL nie powróci żądany folder, gdy użytkownik zmienił domyślnego folderu oszczędzania w dokumentach biblioteki Win7. Aby uzyskać właściwy folder, należy użyć SHLoadLibraryFromKnownFolder, aby uzyskać IShellLibrary dla biblioteki Dokumenty, użyć IShellLibrary::GetDefaultSaveFolder, aby uzyskać IShellItem dla domyślnego folderu składowania biblioteki, a na końcu użyć IShellItem::GetDisplayName, aby uzyskać nazwę folderu.

1
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; 

Co z tym rozwiązaniem? Działa dobrze dla mnie.

+0

że nie używasz argumentu csidl. Jeśli dobrze zrozumiałem, powinien on być umieszczony jako drugi argument SHGetFolderPathW() zamiast CSIDL_MYDOCUMENTS. – BrunoLevy