2010-10-18 15 views

उत्तर

11

SHGetSpecialFolderPathCSIDL वांछित फ़ोल्डर (शायद CSIDL_APPDATA या CSIDL_LOCAL_APPDATA) पर सेट के साथ SHGetSpecialFolderPath का उपयोग करें।

आप नए SHGetFolderPath() और SHGetKnownFolderPath() फ़ंक्शंस का भी उपयोग कर सकते हैं। SHGetKnownFolderIDList() भी है और यदि आपको COM पसंद है तो IKnownFolder::GetPath() है।

+1

ध्यान दें कि यह फ़ंक्शन पहले से ही दो बार हटा दिया गया था। आप अन्य दो (वर्तमान और अनुशंसित फ़ंक्शन सहित) भी दे सकते हैं। – Joey

+0

@ जॉय - मुझे यह एहसास नहीं हुआ था। धन्यवाद। – Ferruccio

6

का उपयोग अगर मैं सही ढंग याद यह सिर्फ होना चाहिए

#include <stdlib.h> 
getenv("APPDATA"); 

संपादित करें: बस की दोबारा जांच कर, ठीक काम करता है!

+3

इसके बजाय उचित एपीआई का उपयोग करें, क्योंकि विंडोज पर पर्यावरण चर एक अनुबंध से अधिक सौजन्यपूर्ण हैं। वे सभी परिस्थितियों में उपस्थित नहीं हो सकते हैं। हालांकि, 'SHGetKnownFolderPath' * आपको * हर बार पथ देगा। – Joey

+0

लेकिन SHGetKnownFolderPath या तो उपलब्ध नहीं हो सकता है। कठिन कुकीज़ –

+0

@ हंस: हालांकि, SHGetSpecialFolderPath होना चाहिए। ओएस एक लक्ष्य के आधार पर। – Joey

0

आप these functions उपयोग कर सकते हैं:

#include <stdlib.h> 
char *getenv( 
    const char *varname 
); 
wchar_t *_wgetenv( 
    const wchar_t *varname 
); 
तो जैसा

:

#include <stdio.h> 
char *appData = getenv("AppData"); 
printf("%s\n", appData); 
+3

इसके बजाय उचित एपीआई का उपयोग करें, क्योंकि विंडोज पर पर्यावरण चर एक अनुबंध से अधिक सौजन्यपूर्ण हैं। वे सभी परिस्थितियों में उपस्थित नहीं हो सकते हैं। हालांकि, 'SHGetKnownFolderPath' * आपको * हर बार पथ देगा। – Joey

+3

प्रति-प्रक्रिया के आधार पर पर्यावरण चर को ओवरराइड करने में सक्षम होना उपयोगी है। आप क्यों कहते हैं कि वे "अनुबंध से अधिक सौजन्य" हैं?क्या इस प्रभाव के लिए कुछ आधिकारिक या अर्ध-आधिकारिक दस्तावेज़ीकरण है? –

3

शायद समय के सबसे अधिक काम करेंगे %APPDATA% वातावरण चर का उपयोग करना। हालांकि, अगर आप इसे आधिकारिक विंडोज़ तरीके से करना चाहते हैं, तो आपको अपनी आवश्यकताओं के आधार पर CSIDL मान CSIDL_APPDATA या CSIDL_LOCAL_APPDATA पास करने के लिए SHGetFolderPath function का उपयोग करना चाहिए।

यह है कि Environment.GetFolderPath() विधि .NET में उपयोग की जा रही है।

संपादित करें: जॉय सही ढंग से इंगित करता है कि इसे विंडोज Vista में SHGetKnownFolderPath द्वारा प्रतिस्थापित किया गया है। मेरे लिए समाचार :-)।

0

नमूना कोड:

TCHAR szPath[MAX_PATH]; 
if (SUCCEEDED(SHGetFolderPath(NULL, 
    CSIDL_APPDATA | CSIDL_FLAG_CREATE, 
    NULL, 
    0, 
    szPath))) 
{ 
    PathAppend(szPath, TEXT("MySettings.xml")); 
    HANDLE hFile = CreateFile(szPath, ...); 
} 

CSIDL_APPDATA = उपयोगकर्ता नाम \ Application Data। में खिड़की 10: उपयोगकर्ता नाम \ AppData \ रोमिंग

CSIDL_FLAG_CREATE = CSIDL_ मूल्य के साथ गठबंधन SHGetFolderPath() में फ़ोल्डर निर्माण के लिए मजबूर करने

तुम भी उपयोग कर सकते हैं:

CSIDL_LOCAL_APPDATA = उपयोगकर्ता नाम \ Local Settings \ अनुप्रयोग डेटा (गैर रोमिंग)

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