2010-03-10 4 views
10

De Visual C++, comment puis-je obtenir le chemin d'accès au dossier Mes documents de l'utilisateur actuel?Obtenir le chemin d'accès à Mes documents

Edit:

J'ai ceci:

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

Cependant, result revient avec une valeur de E_INVALIDARG. Des pensées quant à pourquoi cela pourrait être?

Répondre

14

Cela dépend de l'âge d'un système dont vous avez besoin. Pour les anciens systèmes, il y a SHGetSpecialFolderPath. Pour les systèmes un peu plus récents, il y a SHGetFolderPath. À partir de Vista, il y a SHGetKnownFolderPath. Editer: Vous voulez utiliser CSIDL_PERSONAL, pas CSIDL_MYDOCUMENTS. Code de démonstration qui fonctionne, au moins sur ma machine:

#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

Merci - J'ai essayé SHGetFolderPath, et quelque chose ne fonctionne pas tout à fait - cela vous dérangerait-il de jeter un coup d'œil à mon edit dans la question? – Smashery

+0

Merci beaucoup! – Smashery

+0

Cela semble être un python intégré maintenant. http://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path – totowtwo

8

Utilisez the SHGetFolderPath Windows API function et demandez CSIDL_MYDOCUMENTS.

+0

Je pense que ce lien n'est pas correct, corriger: http://msdn.microsoft.com/fr-fr/library/bb762181%28VS.85%29.aspx – uray

+0

Merci - J'ai essayé cela, et quelque chose ne va pas travailler - cela vous dérangerait-il de jeter un coup d'œil à mon édition dans la question? – Smashery

1

Notez que CSIDL_PERSONAL ne renverra pas le dossier désiré si l'utilisateur a changé de sauvegarde par défaut dossier dans la bibliothèque de documents Win7. Pour obtenir le bon dossier, vous devez utiliser SHLoadLibraryFromKnownFolder pour obtenir le IShellLibrary pour la bibliothèque de documents, utilisez IShellLibrary::GetDefaultSaveFolder pour obtenir le IShellItem pour le dossier de sauvegarde par défaut de la bibliothèque, et enfin utiliser IShellItem::GetDisplayName pour obtenir le nom du dossier.

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; 

que diriez-vous de cette solution? Cela fonctionne bien pour moi.

+0

Il semble que vous n'utilisez pas l'argument csidl. Si j'ai bien compris, il devrait probablement être mis en second argument de SHGetFolderPathW() au lieu de CSIDL_MYDOCUMENTS. – BrunoLevy

Questions connexes