2009-08-11 13 views
5

पर मशीन (उपयोगकर्ता नहीं) पर निर्भर आईएनआई फ़ाइल को सहेजने के लिए कहां है मेरा आवेदन वर्तमान में मौजूदा उपयोगकर्ता की प्रोफ़ाइल (C:\Documents and Settings\<CurrentUser>\Application Data\MyApplication\MySettings.ini WinXP के तहत) के तहत एक आईएनआई फ़ाइल में सेटिंग संग्रहीत कर रहा है। लेकिन मुझे एहसास हुआ है कि इनमें से कुछ सेटिंग्स मशीन के लिए अनूठी हैं जो उपयोगकर्ता नहीं हैं और इस प्रकार सभी उपयोगकर्ताओं के लिए उन्हें एक ही स्थान पर सहेजने के लिए (वास्तव में आवश्यकता है) चाहते हैं।विंडोज़

क्या Windows XP (और ऊपर) पर कोई फ़ोल्डर स्थान है जहां मैं उपयोगकर्ता स्वतंत्र सेटिंग्स संग्रहीत कर सकता हूं?

नोट: मैं उन्हें अपने आवेदन के रूप में एक ही फ़ोल्डर में संग्रहीत करने के लिए नहीं करना चाहती है और न ही मैं उन्हें रजिस्ट्री में संग्रहीत करने के लिए चाहते हैं।

मुझे लगता है कि "सी: \ दस्तावेज़ और सेटिंग्स \" के तहत एक "सभी उपयोगकर्ता" फ़ोल्डर है? क्या मुझे वहां स्टोर करना चाहिए?

बोनस अंक: मैं पुरस्कार के लिए और अधिक संभावना कर रहा हूँ जो कोई भी मुझे बताओ कि डेल्फी 7.

उत्तर

12

XP के लिए में Windows से इस पथ पर लौटने के लिए, विंडोज SHGetFolderPath() प्रदान करता है सकते हैं का जवाब एक ज्ञात स्थान प्राप्त करने के लिए ।

फाइल सिस्टम निर्देशिका कि सभी उपयोगकर्ताओं के लिए आवेदन डेटा शामिल हैं: CSIDL कि आप देख रहे हैं CSIDL_COMMON_APPDATA, के रूप में वर्णित है। एक सामान्य पथ "C:\Documents and Settings\All Users\Application Data" है। यह फ़ोल्डर एप्लिकेशन डेटा के लिए उपयोग किया जाता है जो उपयोगकर्ता विशिष्ट नहीं है। उदाहरण के लिए, कोई एप्लिकेशन वर्तनी-जांच शब्दकोश, क्लिप आर्ट का डेटाबेस, या CSIDL_COMMON_APPDATA फ़ोल्डर में लॉग फ़ाइल संग्रहीत कर सकता है। यह जानकारी घूमती नहीं है और कंप्यूटर का उपयोग कर किसी के भी उपलब्ध है।

Vista के लिए और बाद में, इस SHGetKnownFolderPath() के साथ बदल दिया गया है, हालांकि SHGetFolderPath() अभी भी उस के लिए एक आवरण समारोह के रूप में उपलब्ध है। यदि आप वास्तविक Vista कॉल का उपयोग करते हैं, तो आपको CSIDL_COMMON_APPDATA के बजाय FOLDERID_ProgramData का उपयोग करना चाहिए।

यह लिंक here ऐसा करने का एक तरीका दिखाता है।

यह इस के लिए नीचे उबालने के लिए लगता है (एहतियात के साथ इस इलाज, मैं डेल्फी कि अच्छी तरह से पता नहीं है):

function ShGetKnownFolderPath (
    const rfid: TGUID; 
    dwFlags:  DWord; 
    hToken:  THandle; 
    out ppszPath: PWideChar): HResult; 
var 
    Shell: HModule; 
    Fn: TShGetKnownFolderPath; 
begin 
    Shell := LoadLibrary ('shell32.dll'); 
    Win32Check(Shell <> 0); 
    try 
     @Fn := GetProcAddress (Shell, 'SHGetKnownFolderPath'); 
     Win32Check (Assigned (Fn)); 
     Result := Fn (rfid, dwFlags, hToken, ppszPath); 
    finally 
     FreeLibrary (Shell); 
    end; 
end; 

 

function GetKnownFolderPath (
    const rfid: TGUID; 
    dwFlags: DWord; 
    hToken:  THandle): WideString; 
var 
    buffer: PWideChar; 
    ret: HResult; 
begin 
    ret :=ShGetKnownFolderPath (rfid, dwFlags, hToken, buffer); 
    OleCheck (ret); 
    try 
     Result := buffer; 
    finally 
     CoTaskMemFree (buffer); 
    end; 
end; 

This page सभी CSIDL_* की एक सूची प्रदान और मूल्य। ध्यान रखें कि आपको अपने उपयोगकर्ता-विशिष्ट डेटा के लिए इन फ़ंक्शंस का उपयोग करना चाहिए, हार्ड-कोडेड मान जैसे "C:\Documents and Settings\<CurrentUser>\Application Data\"। हो सकता है कि विंडोज के विभिन्न भाषा संस्करण अलग-अलग निर्देशिका नामों का उपयोग करें या यह संभव है कि उपयोगकर्ता आसानी से अपने डेटा क्षेत्रों को स्थानांतरित कर सकें।

+4

यह सही API है, और सही स्थिति में इस स्थिति में पूछने के लिए। हालांकि, अभी भी स्पष्ट करने की आवश्यकता की तुलना में एक बात है: - उस स्थान पर बनाई गई फ़ाइलें प्रशासक और मालिकों के लिए आरडब्ल्यू हैं, लेकिन अन्य उपयोगकर्ताओं के लिए आर। क्या यह महत्वपूर्ण है कि प्रत्येक _user_ (यानी गैर यूएसी उन्नत व्यवस्थापक या उपयोगकर्ता) आईएनआई फ़ाइल में लिख सकते हैं? यदि ऐसा है, तो सृजन पर, फ़ाइल या फ़ोल्डर की एक्सेस कंट्रोल सूची को समायोजित करने के लिए आवश्यक सभी उपयोगकर्ताओं को आरडब्ल्यू प्रविष्टि शामिल करना आवश्यक है। –

+0

ओच! क्रिस के सिर के लिए धन्यवाद ... तो मैं यह कैसे करूँ? या क्या कोई बेहतर स्थान है जिसमें यह प्रतिबंध नहीं है? – CodeAndCats

+0

नहीं, यह सबसे अच्छा स्थान है। यदि आप चाहते हैं कि उपयोगकर्ता ओवरराइड सिस्टम बनाने से सेटिंग्स संपादित करें। डिफ़ॉल्ट और सामान्य सेटिंग्स "सभी उपयोगकर्ता" फ़ोल्डर में हैं और उपयोगकर्ता उपयुक्त उपयोग प्रोफ़ाइल में विशिष्ट हैं। इस तरह आपके पास वैश्विक रीड-ओनली सेटिंग्स हैं जो उपयोगकर्ता स्वयं के साथ ओवरराइड कर सकते हैं। इस तरह वे एक-दूसरे की सेटिंग्स को नहीं बदलते हैं। – Runner

6

मैं बात की इस तरह के लिए खुला स्रोत JEDI Code Library का उपयोग कर सलाह देते हैं।

JclShell.pas में आप GetSpecialFolderLocation मिल जाएगा()

YourDataFolder := GetSpecialFolderLocation(CSIDL_COMMON_APPDATA); 

यह मुफ़्त है, अच्छी तरह से परीक्षण किया है, सभी विंडोज संस्करणों के साथ काम करता है और का उपयोग कर इसे Windows API के भावी परिवर्तनों से आप बचाने जाएगा।

+1

मुझे अभी इसके साथ परेशानी है। मेरे मामले में, मैं "सामान्य दस्तावेज़" फ़ोल्डर प्राप्त करना चाहता था और मैंने JclSysInfo.GetCommonDocumentsFolder का उपयोग किया (जो GetSpecialFolderLocation का उपयोग करता है, और वह SHGetSpecialFolderLocation का आह्वान करता है)। कई WinXP वातावरण में, जिस पर 'सामान्य दस्तावेज़' सेटिंग्स द्वारा छिपाए जाते हैं, SHGetSpecialFolderLocation हमेशा विफल रहता है, लेकिन SHGetFolderPath काम करता है। इसलिए मुझे JclSysInfo का उपयोग करना छोड़ना है ... – benok

+0

"साझा कंप्यूटर '' मेरा कंप्यूटर 'से छिपा हुआ है" सही है। माफ़ कीजिये। – benok