2009-02-23 20 views
11

हमारे Win32 एप्लिकेशन (सी ++ में लिखे गए) लगभग 10 वर्षों से आसपास रहे हैं, और जहां वे फाइलें रखते हैं, उनके संदर्भ में "अच्छी प्रथाओं" का पालन करने के लिए अद्यतन नहीं किया गया है। एप्लिकेशन "सी: \ AppName" फ़ोल्डर में स्थापित करने के लिए डिफ़ॉल्ट है, और उस फ़ोल्डर के सबफ़ोल्डर में एप्लिकेशन द्वारा जेनरेट की गई फ़ाइलें, कॉन्फ़िगरेशन फ़ाइलें, डाउनलोड की गई फ़ाइलें और सहेजे गए उपयोगकर्ता दस्तावेज़ रखता है।मेरा win32 प्रोग्राम कहां रखना चाहिए?

संभवतः, यह आजकल "सी: \ प्रोग्राम फ़ाइलें \ AppName" के तहत स्थापित करने के लिए डिफ़ॉल्ट रूप से "सर्वोत्तम प्रथाओं" है। लेकिन अगर हम ऐसा करते हैं, तो हमें अपनी बाकी फाइलों को कहां रखना चाहिए? विस्टा से शुरू, प्रोग्राम फाइल फ़ोल्डर में लिखना समस्याग्रस्त है, और ऐसा लगता है कि आप एक लाख अन्य जगहें बना सकते हैं जिन्हें आप अलग-अलग फाइलें डाल सकते हैं, और मैं उलझन में हूं।

क्या वहां कहीं भी संदर्भ है?


संपादित करें: सवालों पर विस्तार करने के लिए लोगों को अब तक पूछा है:


मैं SHGetFolderPath समारोह से परिचित हूँ, लेकिन वहाँ बहुत सारे और विकल्प है कि आप से प्राप्त कर सकते हैं के बहुत सारे हैं यह, और मुझे कोई संसाधन नहीं मिल रहा है जो कहता है "यहां इन विकल्पों में से प्रत्येक का उपयोग किया जाता है, और जब आप इसका उपयोग करना चाहते हैं"।

अभी तक, हमने "एक फ़ोल्डर के तहत सहेजी गई उपयोगकर्ता फ़ाइलों सहित सभी फाइलें" की हैं, और यह ठीक काम किया है - लेकिन जब लोग प्रोग्राम फ़ाइलें फ़ोल्डर के अंतर्गत ऐप इंस्टॉल करना नहीं चाहते हैं। किसी कारण से, Vista के आसपास वर्चुअलाइजेशन बंदरगाह हमारे आवेदन के लिए काम नहीं कर रहा है; अगर हम वैसे भी बदलाव करने जा रहे हैं, तो हम चीजों को "सही" तरीके से करने का प्रयास भी कर सकते हैं, क्योंकि हम इसे 12 महीने के समय में फिर से बदलना नहीं चाहते हैं।


इसके अलावा प्रश्न:


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

अगर हम उन्हें अपने दस्तावेज़ों में स्थापित नहीं कर सकते हैं, तो हमें उन्हें कहां रखना चाहिए ताकि उपयोगकर्ता उन्हें आसानी से देख सकें?

+1

यह सिर्फ विस्टा नहीं है: मुझे संदेह है कि यदि आप XP में अपने ऐप का परीक्षण _ मानक उपयोगकर्ता के रूप में चल रहे हैं, तो आपको प्रोग्राम फ़ाइलों फ़ोल्डर में अपने मौजूदा सेटअप को स्थापित करने में समान समस्याएं होंगी। –

उत्तर

15

मुमकिन है, इसके तहत स्थापित करने के लिए डिफ़ॉल्ट करने के लिए "सर्वोत्तम प्रथाओं" है "c: \ Program Files \" को

बंद है, लेकिन काफी नहीं। उपयोगकर्ता प्रोग्राम फ़ाइलें फ़ोल्डर का नाम कॉन्फ़िगर कर सकते हैं और यहां तक ​​कि सी: ड्राइव भी नहीं हो सकता है। इसके बजाय, %ProgramFiles%\AppName पर्यावरण चर फ़ोल्डर में स्थापित करें। ध्यान दें कि आपको लगता है कि इंस्टॉलेशन समाप्त होने के बाद आपको केवल इस फ़ोल्डर तक पहुंच पढ़नी चाहिए।

प्रोग्राम डेटा फ़ाइलों के लिए जहां आपको लेखन पहुंच की आवश्यकता हो सकती है, %AppData%\AppName का उपयोग करें।

अंत में, क्या आप वाकई उस नाम के साथ एकमात्र ऐप है? यदि आप उसमें से 100% निश्चित नहीं हैं, तो आप वहां भी अपनी कंपनी का नाम शामिल करना चाहेंगे।

उन चरों को पुनर्प्राप्त करने के लिए उपयोग की जाने वाली तंत्र आपके प्रोग्रामिंग प्लेटफॉर्म के आधार पर अलग-अलग होंगी। यह आम तौर पर अंत में SHGetFolderPath() Win32 विधि पर आता है, लेकिन जावा या नेट जैसे विभिन्न प्लेटफॉर्म भी सरल अबाउटेशन प्रदान कर सकते हैं।

+0

जब मैं यह जवाब लोड करता हूं तो मैं बहुत कुछ कहकर आधा रास्ते था। +1 – Randolpho

+0

क्या मैंने आपको पहले डिशशेड में देखा है, रैंडोल्फो? –

+0

शायद, मैं दिन में लगातार वहां जाता था। हालांकि, मुझे इन दिनों मेरी त्वचा के नीचे ढेर अतिप्रवाह मिला है। :) – Randolpho

6

सही निर्देशिका प्राप्त करने के लिए Windows SHGetFolderPath() फ़ंक्शन का उपयोग करें।

संपादित करें: अपने अन्य प्रश्न का उत्तर देने के लिए, संपादित में जोड़ा गया: आपके आवेदन की नमूना फाइल कहां रखनी है इस पर निर्भर करता है कि आपका एप्लिकेशन एक उपयोगकर्ता या सभी उपयोगकर्ताओं के लिए स्थापित है या नहीं, और क्या एप्लिकेशन इंस्टॉल करने वाले व्यक्ति को इसका इस्तेमाल करने वाले व्यक्ति के रूप में माना जा सकता है।

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

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

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

+0

डाउनवोट के साथ अच्छा चल रहा है। अगर कोई है तो तर्क की व्याख्या करने की देखभाल करें? – mghie

+0

किसी भी डाउनवॉटिंग से संबंधित नहीं है, "नोट Windows Vista के रूप में, यह फ़ंक्शन केवल SHGetKnownFolderPath के लिए एक रैपर है। CSIDL मान को इसके संबंधित KNOWNFOLDERID में अनुवादित किया गया है और फिर SHGetKnownFolderPath कहा जाता है। नए अनुप्रयोगों को ज्ञात फ़ोल्डर सिस्टम का उपयोग करना चाहिए ..." – JMD

+0

अच्छा मुद्दा, मेरे जवाब में संशोधन किया है। –

-2

हमारे पास एक समान ऐप है जो 10 साल पहले एमएफसी का उपयोग कर बनाया गया था। करने के लिए सबसे आसान काम सी: \ (उदा। सी: \ OurApp) के ठीक एक फ़ोल्डर बना था। कोई इंस्टॉल फाइल नहीं, कोई विशेष अनुमति नहीं, कोई रजिस्ट्री परिवर्तन नहीं, आदि ग्राहक (और विशेष रूप से उनके sys admins) इसे प्यार करते हैं।

एक अन्य विचार - क्या आप मौजूदा ग्राहकों के लिए इंस्टॉलेशन फ़ोल्डर को अचानक बदलने की योजना बना रहे हैं (माना जाता है कि यह कई स्थानों पर स्थापित है)? अगर कुछ तोड़ नहीं है, तो इसे ठीक क्यों करें?

+0

मुझे लगता है कि वह बिल्कुल सही पैटर्न है जिसे वह सही करने की कोशिश कर रहा है। – JMD

+0

SysAdmins इन दिनों इतने रोमांचित नहीं हैं। चूंकि उपयोगकर्ताओं को डिफ़ॉल्ट परिनियोजन से अधिकार नहीं होंगे, इसलिए परेशानी होती है। –

+0

कोई इंस्टॉल फाइल नहीं के साथ, उपयोगकर्ता इसे अनइंस्टॉल कैसे करते हैं? क्या आपने कभी एक्सपी सीमित उपयोगकर्ता या Vista मानक उपयोगकर्ता के साथ स्थापित करने और चलाने का परीक्षण किया है? –

-1

उपयोगकर्ता उन्मुख डेटा के लिए c: \ उपयोगकर्ताओं के अंतर्गत एक निर्देशिका संरचना है।

पुराने विंडोज़ ओएस से Vista तक ऐप्स पोर्ट करने के लिए प्रलेखन है।

http://www.innovateon.com देखें और Vista के लिंक का पालन करें। प्रमाणन के संबंध में दस्तावेज है जिसमें इस तरह के विषयों पर विवरण है।

+0

-1 होगा, यह सी: \ के रूप में परिभाषित नहीं है। मेरे मल्टीबूट इंस्टॉल में, इसे कभी-कभी जे: \ के रूप में असाइन किया गया था, उदाहरण के लिए। मनोरंजन समय। –

+0

99% कंप्यूटर पर, यह सी है: \। मुख्य बिंदु यह है: दस्तावेज़ीकरण मौजूद है जो लोगों को बताता है कि विस्टा को बंदरगाह कैसे करना है, कहां रखना है, इत्यादि। यहां एक "करीबी" लिंक है: http://www.innovateon.com/pageLayout.aspx?pageID = VistaCertBuild आवश्यकताएँ दस्तावेज़ पर नज़र डालें। – sebastus

-1

खेद है कि मैं सही जवाब पता नहीं है, लेकिन ...

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

+0

आप एक बहुत ही वास्तविक जोखिम चलाते हैं कि प्रोग्राम Vista और Windows के बाद के संस्करणों पर गैर-व्यवस्थापक खातों के अंतर्गत नहीं चलता है। कॉर्पोरेट वातावरण में ऐप के लिए यह मौत की सजा हो सकती है। – mghie

+0

आह, जानना अच्छा है। धन्यवाद। तो इसका मतलब है कि उसके ऐप्स वास्तव में किसी तरह से अपंग हो सकते हैं, और वास्तव में उनके पास एक वैध व्यावसायिक मामला है। –

9

कुछ दिशानिर्देश इस ज्ञानकोष आलेख में हैं: How to write a Windows XP Application that stores user and application data in the correct location by using Visual C++। इसके अलावा, यदि आप विंडोज लोगो प्रोग्राम के लिए एमएसडीएन खोजते हैं तो आपको वास्तव में अनुपालन करने के लिए एक ऐप को क्या करने की आवश्यकता है, इसके बारे में दस्तावेज मिलेगा।

SHGetKnownFolderPath आपको अपनी निर्देशिका की आवश्यकता हो सकती है। XP के साथ पश्च संगतता और पहले की आवश्यकता है, का उपयोग पदावनत SHGetFolderPath

कहा करने के बाद कि, अगर आप अनुप्रयोग प्रलेखन कि ने कहा, "इस एप्लिकेशन के द्वारा प्रयोग किया सब कुछ इस निर्देशिका में है" के साथ आया था मैं करूंगा प्यार यह;)

+0

एफवाईआई, मैंने मागी के जवाब के साथ एक टिप्पणी छोड़ दी कि एमएसएफटी का कहना है कि SHGetFolderPath को SHGetKnownFolderPath के पक्ष में बहिष्कृत किया गया है। – JMD

+0

एक मेनू कमांड जो "सहायक फ़ाइल फ़ोल्डर दिखाएं" कहता है जो एक्सप्लोरर को उचित फ़ोल्डर में खुलता है वह भी शानदार होगा। –

0

ऐसे कई पर्यावरण चर जैसे हैं:% USERPROFILE%,% HOMEPATH%,% APPDATA% इन सभी बिंदुओं को कुछ उपयोगकर्ता-विशिष्ट निर्देशिकाओं में, जहां आप अपनी उपयोगकर्ता-विशिष्ट फ़ाइलों को डाल सकते हैं।

सिस्टम-व्यापी स्टोरेज के लिए आप% ALLUSERSPROFILE% का उपयोग कर सकते हैं, यह वह जगह है जहां आपको अपनी पढ़ी/लिखने वाली डेटाफाइल डालना चाहिए जो किसी भी उपयोगकर्ता के लिए विशिष्ट नहीं हैं।

2

अपने आवेदन बाइनरी के लिए, आप मान सकते हैं कि आप प्रोग्राम FILES निर्देशिका में लिख सकते हैं (डिफ़ॉल्ट प्रोग्राम संस्करण के अलावा इंस्टॉलेशन का समर्थन करने के लिए% ProgramFiles% पर्यावरण चर का उपयोग करें - उदाहरण के लिए जर्मन इंस्टॉलेशन में यह c: \ Program होगा डिफ़ॉल्ट रूप से)। Wikipedia सबसे आम चर सूचीबद्ध करता है। एक और विकल्प SHGetFolderPath या नए SHGetKnownFolderPath फ़ंक्शंस हैं।

उपयोगकर्ता डेटा के लिए, आपको यह मानना ​​चाहिए कि एप्लिकेशन सीमित पहुंच अधिकारों के साथ चल रहा है और केवल उपयोगकर्ता की होम निर्देशिका को लिख सकता है। रजिस्ट्री प्रविष्टियों के लिए भी लागू होता है। यह पथ शायद उपयोगकर्ता को विन्यास योग्य होना चाहिए, क्योंकि होम निर्देशिका वास्तव में नेटवर्क सर्वर हो सकती है और उपयोगकर्ता के पास डेटा संग्रहण के लिए दूसरी डिस्क संलग्न हो सकती है। वर्तमान (Vista) फाइल सिस्टम दिशानिर्देशों के बारे में जानकारी के लिए this article देखें।

प्लगइन के संबंध में, यह अधिक जटिल हो सकता है। सबसे अच्छा अभ्यास केवल मौजूदा उपयोगकर्ता के लिए स्थापित करने के विकल्प की पेशकश करने और उपयोगकर्ता निर्देशिका में प्लगइन रखने, या सभी उपयोगकर्ताओं के लिए स्थापित करने और फ़ाइलों को अपनी प्रोग्राम फाइल निर्देशिका में रखने के लिए (लेकिन लिखने की अनुमति और अनुरोध की जांच करना याद रखें) यदि आवश्यक हो तो elavated पहुंच)।

+0

उपयोगी सफेद पेपर लिंक - धन्यवाद! – Colen

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