2010-03-10 17 views
10

विज़ुअल सी ++ से, मैं वर्तमान उपयोगकर्ता के मेरे दस्तावेज़ फ़ोल्डर का मार्ग कैसे प्राप्त करूं?मेरे दस्तावेज़ों के लिए पथ प्राप्त करें

संपादित करें:

मैं इस है:

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

हालांकि, resultE_INVALIDARG के एक मूल्य के साथ वापस आ रहा है। ऐसा कोई विचार क्यों हो सकता है?

उत्तर

14

यह इस बात पर निर्भर करता है कि आपको कितनी पुरानी प्रणाली के साथ संगतता की आवश्यकता है। पुराने सिस्टम के लिए, 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; 
} 
+0

धन्यवाद - मैंने SHGetFolderPath को आजमाया है, और कुछ काम नहीं कर रहा है - क्या आप इस सवाल में मेरे संपादन को देखकर दिमाग में रहेंगे? – Smashery

+0

बहुत बहुत धन्यवाद! – Smashery

+0

यह अब एक पायथन बनाया गया प्रतीत होता है। http://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path – totowtwo

8

the SHGetFolderPath Windows API function का उपयोग करें और CSIDL_MYDOCUMENTS का अनुरोध करें।

+0

मुझे लगता है कि लिंक सही नहीं है, ठीक करें: http://msdn.microsoft.com/en-us/library/bb762181%28VS.85%29.aspx – uray

+0

धन्यवाद - मैंने कोशिश की है, और कुछ काफी नहीं है काम करना - क्या आप इस सवाल में मेरे संपादन को देखने पर ध्यान देंगे? – Smashery

1

ध्यान दें कि CSIDL_PERSONAL इच्छित फ़ोल्डर नहीं लौटेगा यदि उपयोगकर्ता Win7 दस्तावेज़ लाइब्रेरी में फ़ोल्डर बचाने डिफ़ॉल्ट बदल गया है। सही फ़ोल्डर प्राप्त करने के लिए, आपको SHLoadLibraryFromKnownFolder का उपयोग दस्तावेज़ पुस्तकालय के लिए IShellLibrary प्राप्त करने के लिए, IShellLibrary::GetDefaultSaveFolder का उपयोग लाइब्रेरी के डिफ़ॉल्ट सहेजने वाले फ़ोल्डर के लिए IShellItem प्राप्त करने के लिए करें, और अंत में फ़ोल्डर नाम प्राप्त करने के लिए IShellItem::GetDisplayName का उपयोग करें।

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; 

कैसे इस समाधान के बारे में? यह मेरे लिए ठीक काम कर रहा है।

+0

ऐसा लगता है कि आप csidl तर्क का उपयोग नहीं कर रहे हैं। अगर मैं अच्छी तरह से समझ गया, तो इसे शायद CSIDL_MYDOCUMENTS के बजाय SHGetFolderPathW() के दूसरे तर्क के रूप में रखा जाना चाहिए। – BrunoLevy

संबंधित मुद्दे