2012-10-07 17 views
10

मेरे पास एक डेल्फी 6 एप्लिकेशन है, जो कि अधिकांश विंडोज अनुप्रयोगों की तरह है, उपयोगकर्ता के "स्थानीय एप्लिकेशन डेटा" फ़ोल्डर में डेटा पढ़ता/लिखता है। मैं उस फ़ोल्डर को निर्धारित करने के लिए नीचे दिए गए कोड का उपयोग करता हूं। अब तक, यह कोड मेरे अधिकांश उपयोगकर्ताओं के लिए काम करता है।विंडोज उपयोगकर्ता के "सच" एप्लिकेशन डेटा फ़ोल्डर ढूँढना?

C:\Users\Bob\AppData\Roaming\ 

आमतौर पर स्थानीय एप्लिकेशन डेटा फ़ोल्डर में निराकरण:

C:\Documents and Settings\Bob\Application Data\ 

क्या इस उपयोगकर्ता की विशेष स्थिति के बारे में अजीब है कि कई है मैं जिसका स्थानीय ऐप्लिकेशन डेटा की उम्मीद फ़ोल्डर में नहीं है एक उपयोगकर्ता का सामना करना पड़ा HKEY_LOCAL_MACHINE में सामान्य रूप से मिली रजिस्ट्री कुंजी वास्तव में HKEY_CURRENT_USER में स्थित होती हैं। वे विंडोज 7 पर चल रहे हैं।

बेहतर शब्द की कमी के लिए, क्या उपयोगकर्ता के लिए "सत्य" एप्लिकेशन डेटा प्राप्त करने का कोई तरीका है ताकि मैं इस स्थिति को बेहतर तरीके से नेविगेट कर सकूं? यदि यह समझदारी से CSIDL_APPDATA, CSIDL_COMMON_APPDATA और CSIDL_LOCAL_APPDATA विशेष फ़ोल्डर के बीच चयन करने का विषय है, तो ऐसा करने के लिए तर्क क्या है? जैसा कि आप बता सकते हैं कि मैं एक ऐसे उद्देश्य के लिए फ़ंक्शन ढूंढ रहा हूं जो सही एप्लिकेशन डेटा फ़ोल्डर को रूट कर सकता है चाहे उपयोगकर्ता के चल रहे विंडोज़ संस्करण या उनके विशिष्ट पीसी कॉन्फ़िगरेशन के बावजूद।

मुझे यह स्टैक ओवरफ़्लो पोस्ट मिला जो उत्तर देने लगता है लेकिन यह .NET लाइब्रेरी से फ़ंक्शन का उपयोग कर रहा है और मैं डेल्फी 6 का उपयोग कर रहा हूं। यदि यह समाधान मेरे प्रश्न का उत्तर देता है, तो क्या कोई मुझे इसे दोहराने का एक त्वरित तरीका बता सकता है डेल्फी में:

How can i get the path of the current user's "Application Data" folder?

// Function to get the app data special folder. 
function GetAppdataFolder: string; 
begin 
    Result := GetSpecialFolderLocation(CSIDL_APPDATA); 
end; 
+0

@SertacAkyuz - यह पता चला कि समस्या का असली कारण यह था कि उपयोगकर्ता को अपने प्रोग्राम को व्यवस्थापक अधिकारों के साथ स्थापित करने की आवश्यकता होती है, जो कि अधिकांश उपयोगकर्ता के सिस्टम पर नहीं होता है। उन लोगों के लिए उचित होना जिन्होंने पहले ही मूल पोस्ट का जवाब दिया था, मैंने पोस्ट को मूल रूप में वापस कर दिया और नए प्रश्न के लिए एक नई पोस्ट बनाई: http://stackoverflow.com/questions/12772615/why-is-my-delphi -6-प्रोग्राम-ट्रिगरिंग-ए-अनुरोध-के लिए-admin-rights-on-install- –

+0

GetSpecialFolderLocation कहां है? (मुझे अपने उपयोग खंड में कौन सी इकाई जोड़नी चाहिए?) – cja

उत्तर

8

.net कोड जो आप Environment.SpecialFolder.ApplicationData का उपयोग करने के लिए लिंक करते हैं, जो बिल्कुल CSIDL_APPDATA जैसा है। तो आपका कोड पहले से ही .NET कोड के बराबर है जिसे आप लिंक करते हैं। और ये दोनों FOLDERID_RoamingAppData के समान स्थान को संदर्भित करते हैं।

FOLDERID_RoamingAppData के लिए प्रलेखन पर नज़र डालें। यह कहता है:

 
Default Path  %APPDATA% (%USERPROFILE%\AppData\Roaming) 
Legacy Default Path %APPDATA% (%USERPROFILE%\Application Data) 

"डिफ़ॉल्ट पथ" आप Vista या बाद में देखेंगे। एक्सपी पर आप "लीगेसी पाथ" देखते हैं।

आपके द्वारा देखी गई विभिन्न व्यवहार XP और Vista/7/8 के बीच अपेक्षित अंतर से अधिक कुछ नहीं है।

मेरे Windows मशीन पर,

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

C:\Users\heff\AppData\Roaming 

दूसरे शब्दों में करने के लिए, अपने कोड पहले से ही सही काम कर रही है मूल्यांकन करता है। आपको इसमें कोई भी बदलाव करने की ज़रूरत नहीं है। GetSpecialFolderLocation(CSIDL_APPDATA) का उपयोग करने पर ले जाएं।


क्या इस उपयोगकर्ता की विशेष स्थिति के बारे में अजीब है कि कई रजिस्ट्री कुंजियों को सामान्य रूप से HKEY_LOCAL_MACHINE में पाया वास्तव में HKEY_CURRENT_USER में स्थित हैं।

यह असामान्य नहीं है। अक्सर प्रायः HKLM में डिफ़ॉल्ट सेटिंग्स को कॉन्फ़िगर करते हैं और फिर एप्लिकेशन को पहले चलाने पर उन्हें HKCU पर कॉपी करें। प्रश्न में सेटिंग्स के बारे में अधिक जानकारी के बिना अपने प्रश्न के उस पहलू पर टिप्पणी करना मुश्किल है।

+0

धन्यवाद। कृपया मूल पोस्ट में मेरा हालिया अपडेट देखें। –

+0

मैंने आपके द्वारा पूछे गए प्रश्न का उत्तर दिया। आपका अपडेट शायद यूएसी से संबंधित है जो एक्सपी पर मौजूद नहीं है। मुझे लगता है कि इस तरह के सवाल को पूरी तरह से बदलना उचित नहीं है। मैंने इस जवाब में बहुत मेहनत की है। मुझे लगता है कि आपको सवाल वापस लेना चाहिए, जवाब स्वीकार करना चाहिए और एक नया सवाल पूछना चाहिए। बहुत सारे विवरण जो यहां नहीं हैं। बेशक –

+0

। मैं अब वह करूँगा और धन्यवाद। –

5

आप इस (एक आवरण) का उपयोग कर सकते हैं। आपको अपने उपयोग खंड में ShlApi जोड़ने की आवश्यकता होगी। इसे ऊपर दिए गए नमूने की तरह CSIDL_APPDATA पास करें। विभिन्न CSIDL_ मानों की सूची के लिए, MSDN page here

function GetShellFolder(CSIDLFolder : integer) : string; 
begin 
    SetLength(Result, MAX_PATH); 
    SHGetSpecialFolderPath(0, PChar(Result), CSIDLFolder, false); 
    SetLength(Result, StrLen(PChar(Result))); 
    if (Result <> '') then 
    Result := IncludeTrailingBackslash(Result); 
end; 

आप Windows (XP और नीचे) है, जो अपने पाठ प्रकट होता है मामला है के पहले का समर्थन कर रहे हैं देखते हैं, आप SHGetFolderPath बजाय का उपयोग कर सकते हैं:

function GetFolderPath(Wnd: HWnd; CSIDLFolder: Integer): string; 
begin 
    SetLength(Result, MAX_PATH); 
    Result := SHGetFolderPath(Wnd, CSIDLFolder, nil, 0, PChar(Result); 
    SetLength(Result, StrLen(PChar(Result))); 
end; 

यदि आप केवल विस्टा और उच्चतर का समर्थन कर रहे हैं, तो आपको इसके बजाय SHGetKnownFolderPath का उपयोग करना चाहिए, और इसे KNOWNFOLDERID पास करना चाहिए।

जहां तक ​​रजिस्ट्री समस्या है, विंडोज विस्टा और 7 उन स्थानों के बारे में अधिक प्रतिबंधक हैं जो गैर-व्यवस्थापक उपयोगकर्ता लिख ​​सकते हैं, और एचसीएलएम और एचकेसीआर में होने वाली जगहों में से एक है। उन छिद्रों में होने वाली कई वस्तुओं में अब एचकेसीयू में हैं, या वहां प्रतिबिंबित हैं।

+0

क्या प्रश्न नहीं है कि किस प्रकार से 'सीएसआईडीएल' का प्रयोग पथ में परिवर्तित करने के बजाय किया जाए? ऐसा लगता है कि रॉबर्ट पहले ही जानता है कि 'सीएसआईडीएल' को पथ में कैसे परिवर्तित किया जाए। या क्या मैं इसे गलत तरीके से पढ़ रहा हूं? –

+0

मुझे लगता है कि आप इसे गलत तरीके से पढ़ रहे हैं। उनका पाठ इंगित करता है कि वह पथ नहीं पढ़ रहा है (वह स्थान मान रहा है), और इसलिए Win7 पर किसी उपयोगकर्ता के साथ समस्या हो रही है जहां डेटा गलत जगह पर है। वह कहता है कि वह * उस समाधान का उपयोग करने में सक्षम नहीं है जिसे वह मिला क्योंकि वह .NET से है और वह डेल्फी का उपयोग कर रहा है। –

+0

मैंने इस प्रश्न में कोड को वर्तमान में इस्तेमाल किया जा रहा कोड के रूप में पढ़ा है। और फिर 'CSIDL_COMMON_APPDATA' और' CSIDL_LOCAL_APPDATA' के संदर्भ हैं। रॉबर्ट पूछ रहा है कि किस का उपयोग करना है। कम से कम इस तरह मैंने इसे पढ़ा। मुझे लगता है कि रॉबर्ट जेडीआई लाइब्रेरी से 'GetSpecialFolderLocation' का उपयोग कर रहा है। मुझे लगता है कि रॉबर्ट एक एक्सपी मशीन का उपयोग कर रहा है और Vista में किए गए एमएस प्रोफाइल फ़ोल्डरों के पुनर्गठन को मान्यता नहीं देता है। वह सोचता है कि विभिन्न पथ इससे कुछ और इंगित करते हैं। –

5

यदि यह समझदारी से CSIDL_APPDATA, CSIDL_COMMON_APPDATA और CSIDL_LOCAL_APPDATA विशेष फ़ोल्डरों के बीच चुनने की बात है, क्या ऐसा करने के लिए तर्क है?

हां, यह सिर्फ एक मामला है। आपका कोड पहले से ही अपेक्षित काम कर रहा है।

CSIDL_APPDATA (FOLDERID_RoamingAppData) डेटा के लिए है जो कई मशीनों (कॉलिंग "रोमिंग" डेटा) पर कॉलिंग थ्रेड के वर्तमान उपयोगकर्ता खाते (जिसे प्रतिरूपित किया जा सकता है) तक पहुंच योग्य है।

CSIDL_LOCAL_APPDATA (FOLDERID_LocalAppData) डेटा के लिए है जो केवल स्थानीय मशीन पर कॉलिंग थ्रेड के वर्तमान उपयोगकर्ता खाते तक पहुंच योग्य है (वह "स्थानीय" डेटा)।

CSIDL_COMMON_APPDATA (FOLDERID_ProgramData) डेटा के लिए है जो स्थानीय मशीन पर किसी भी उपयोगकर्ता खाते के लिए पहुंच योग्य है (न कि "रोमिंग" डेटा)।

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

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