2010-03-10 18 views
10

Da Visual C++, come ottengo il percorso della cartella Documenti dell'utente corrente?Ottieni percorso a Documenti

Edit:

ho questo:

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

Tuttavia, result sta tornando con un valore di E_INVALIDARG. Qualche idea sul perché questo potrebbe essere?

risposta

14

Dipende dalla durata di un sistema con cui è necessaria la compatibilità. Per i vecchi sistemi, c'è SHGetSpecialFolderPath. Per i sistemi un po 'più recenti, c'è SHGetFolderPath. A partire da Vista, c'è SHGetKnownFolderPath.

Modifica: si desidera utilizzare CSIDL_PERSONAL, non CSIDL_MYDOCUMENTS. codice demo che funziona, almeno sulla mia macchina:

#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

Grazie - Ho provato SHGetFolderPath e qualcosa non funziona - ti dispiacerebbe dare un'occhiata alla mia modifica nella domanda? – Smashery

+0

Grazie mille! – Smashery

+0

Questo sembra essere un python integrato ora. http://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path – totowtwo

8

Utilizzare the SHGetFolderPath Windows API function e richiedere CSIDL_MYDOCUMENTS.

+0

penso che il collegamento non sia corretto, correggi: http://msdn.microsoft.com/en-us/library/bb762181%28VS.85%29.aspx – uray

+0

Grazie - L'ho provato, e qualcosa non è del tutto lavorando - ti dispiacerebbe dare un'occhiata alla mia modifica nella domanda? – Smashery

1

Nota che CSIDL_PERSONAL non restituirà la cartella desiderata se l'utente ha cambiato la cartella di salvataggio predefinita nella libreria Documenti Win7. Per ottenere la cartella giusta, è necessario utilizzare SHLoadLibraryFromKnownFolder per ottenere il IShellLibrary per la libreria Documenti, utilizzare IShellLibrary::GetDefaultSaveFolder per ottenere il IShellItem per la cartella di salvataggio predefinita della libreria e, infine, utilizzare IShellItem::GetDisplayName per ottenere il nome della cartella.

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; 

come su questa soluzione? Funziona bene per me.

+0

Sembra che non stai usando l'argomento csidl. Se ho capito bene, dovrebbe probabilmente essere messo come secondo argomento di SHGetFolderPathW() invece di CSIDL_MYDOCUMENTS. – BrunoLevy