2012-01-13 12 views
12

संपादित करें: टिम Schmelter से जवाब नंबर 1 पढ़ें और फिर संसाधनों एम्बेड करने के लिए कैसे के उदाहरण के लिए इस सवाल का उपयोग करें और उन्हें रनटाइम पर एक्सेस करते हैं।एंबेडेड संसाधन के बारे में भ्रम Unraveling

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

विधि 1:

संपत्ति पृष्ठों को खोलने और संसाधन टैब पर जाने के लिए मेरी परियोजना पर डबल क्लिक करें। अब संसाधन जोड़ें> मौजूदा फ़ाइल जोड़ें पर क्लिक करें। उस फ़ाइल को ब्राउज़ करें जिसे आप एम्बेड करना चाहते हैं। इस उदाहरण के लिए मैं निष्पादन योग्य का उपयोग कर रहा हूं। अब आप संसाधन टैब पर अपनी फ़ाइल देखेंगे:

enter image description here

तुम भी देखेंगे कि संसाधन नाम का एक फ़ोल्डर अपनी परियोजना के तहत बनाया गया था और एम्बेडेड फ़ाइल इस फ़ोल्डर में रखा गया है:

enter image description here

संपादित करें: अगले चरण में यह समस्या थी। जब आप एक फ़ाइल के माध्यम से एक फ़ाइल जोड़ते हैं तो आपको संसाधनों को एकत्रित करने के लिए तैयार कार्रवाई की आवश्यकता होती है। कम से कम कहने के लिए अंतर्ज्ञानी काउंटर!

अब चयनित फ़ाइल के साथ, फ़ाइल के लिए गुण खिड़की पर नीचे देखो और एंबेडेड संसाधन के निर्माण कार्रवाई बदलने के लिए: (यह चरण ही किया जाना चाहिए जब आप विधि 2 के माध्यम से एक फ़ाइल जोड़ें)।

enter image description here

अब अपने कार्यक्रम संकलन। आप देखेंगे कि आपके संकलित प्रोग्राम का आकार कम से कम आपके एम्बेडेड संसाधन के आकार को दोगुना कर देता है। इस विधि के साथ ऐसा नहीं होता है 2. यहाँ देखें:

विधि 2:

अपने प्रोजेक्ट के नाम पर राइट क्लिक करें और जोड़े> मौजूदा आइटम का चयन करें।

enter image description here

अब एक बार फिर से फ़ाइल का चयन करें और एंबेडेड के लिए कार्रवाई बिल्ड बदलने के लिए: अपनी फ़ाइल के लिए ब्राउज़ करें, और इस बार आप देखेंगे कि जब यह वास्तव में अपनी परियोजना के अंतर्गत रखा गया था, वहाँ कोई संसाधन फ़ोल्डर बनाया था संसाधन और संकलन। इस बार संकलित प्रोग्राम का आकार आपके जैसा अपेक्षित होगा - एम्बेडेड फ़ाइल के आकार के बारे में और विधि 1 के साथ आकार को दोगुना नहीं।

आपकी फ़ाइल को एम्बेड करने के लिए आप जिस विधि का उपयोग करते हैं, यह निर्धारित करेगा कि आप किस विधि का उपयोग कर सकते हैं रनटाइम पर फ़ाइल तक पहुंचने के लिए।विधि 1 के लिए यह बहुत आसान है, तुम सब करने की ज़रूरत है:

My.Computer.FileSystem.WriteAllBytes(Path, My.Resources.ResourceName, Append) 

कहाँ पथ स्थान और फ़ाइल आप harddrive पर बचाने के लिए चाहते हैं के लिए नाम है, ResourceName एम्बेडेड संसाधन का नाम है कि आप प्रोजेक्ट विंडो में देखें (किसी भी एक्सटेंशन को घटाएं), और परिशिष्ट यह है कि आप एक नई फाइल बनाना चाहते हैं या किसी मौजूदा फ़ाइल को ओवरराइट करना चाहते हैं। उदाहरण के लिए, ऊपर छवियों से test.exe का उपयोग कर, मैं उस फ़ाइल इस तरह सी ड्राइव करने के लिए बचा सकता है:

My.Computer.FileSystem.WriteAllBytes(“C:\test.exe”, My.Resources.test, False) 

आसान नहीं हो सकता है।

विधि 2 हालांकि आपको मेरे स्रोतों तक पहुंच प्रदान नहीं करता है, इसलिए यह थोड़ा और जटिल हो जाता है। संसाधन को पकड़ने के लिए आपको स्ट्रीम बनाना है, स्ट्रीम को बाइट सरणी में रखना है, फिर फ़ाइल सिस्टम में बाइट्स लिखें।

Using s As Stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(WindowsApplication1.test.exe) 
Dim bytes(s.Length) As Byte 
s.Read(bytes, 0, bytes.Length) 
File.WriteAllBytes(“C:\test.exe”, bytes) 
End Using 

:

Using s As Stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(Project.ResourceName) 
Dim bytes(s.Length) As Byte 
s.Read(bytes, 0, bytes.Length) 
File.WriteAllBytes(OutputFile, bytes) 
End Using 
इस विधि ResourceName फाइल एक्सटेंशन और इस परियोजना का नाम शामिल है ताकि से ऊपर हम सिर्फ कर सकते हैं हमारे उदाहरण का उपयोग करना चाहिए साथ

: सबसे आसान तरीका है मैं यह करने के पाया है इस तरह है टेक्स्ट आधारित फ़ाइलों थोड़ा अलग हैं:

Dim output As String 
Using sr As StreamReader = New StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(WindowsApplication1.test.txt)) 
output = sr.ReadToEnd() 
End Using 

Using sw As StreamWriter = New StreamWriter(“C:\test.txt”) 
sw.Write(output) 
End Using 

अतीत मुझे आशा है कि यह किसी को मदद मिलेगी में इस के साथ संघर्ष करने के बाद। और यदि आपको लगता है कि आप वास्तव में समझा सकते हैं कि संसाधन को एम्बेड करने की विधि 1 क्यों मेरे संकलित प्रोग्राम को अपने आकार को दोगुना करने के लिए, मैं वास्तव में इसकी सराहना करता हूं।

उत्तर

9

मुझे लगता है कि विधि 1 फ़ाइलों को दो बार जोड़ रहा है।

कम से कम कि thread above का निष्कर्ष है।

उद्धरण:

आप परियोजना संपत्तियों के संसाधन पृष्ठ के पास गया और वहीं फ़ाइलों कहा,? फिर आप समाधान एक्सप्लोरर में गए और फ़ाइलों के बिल्ड एक्शन को एम्बेडेड संसाधन में बदल दिया, है ना? यही कारण है कि आप फ़ाइल आकार को दोगुना कर रहे थे: आप प्रत्येक फ़ाइल को दो बार जोड़ रहे थे।

संसाधन जोड़ने के दो अलग-अलग तरीके हैं: प्रोजेक्ट गुणों के संसाधन पृष्ठ पर और समाधान एक्सप्लोरर में। आप दोनों नहीं करते हैं। यदि आप GetManifestResourcestream का उपयोग करना चाहते हैं तो आप संसाधन पृष्ठ का उपयोग नहीं करते हैं। आप प्रोजेक्ट में फ़ाइलों को मैन्युअल रूप से समाधान एक्सप्लोरर में जोड़ते हैं, फिर आप बिल्ड एक्शन को एम्बेडेड संसाधन पर सेट करते हैं।

भविष्य में, एक या दूसरे को करें, दोनों नहीं।

  1. प्रोजेक्ट गुणों के संसाधन पृष्ठ पर एक फ़ाइल जोड़ें और फिर इसे My.Resources के माध्यम से एक्सेस करें। यह स्वचालित रूप से समाधान एक्सप्लोरर में प्रोजेक्ट में फ़ाइल जोड़ देगा लेकिन बिल्ड एक्शन कोई नहीं होगा और इसे इस तरह से छोड़ा जाना चाहिए।

  2. नया आइटम जोड़ें या मौजूदा आइटम जोड़ें का उपयोग करके समाधान एक्सप्लोरर में प्रोजेक्ट में फ़ाइल जोड़ें। फ़ाइल के बिल्ड एक्शन को एंबेडेड रिसोर्स पर सेट करें और फिर GetManifestResourceStream का उपयोग करके संसाधन तक पहुंचें।

+0

आप बिल्कुल सही हैं। मेरा खुद का भ्रम यह सोच रहा था कि निर्माण कार्य को "एम्बेडेड संसाधन" पर सेट किया जाना चाहिए, भले ही आपने संसाधन टैब के माध्यम से फ़ाइल को जोड़ा हो। मुझे कल्पना है कि यह एक बहुत ही आम गलती है। इसलिए दिया गया है कि My.Resources चीजों को इतना आसान बनाता है, मैं एम्बेडेड संसाधन जोड़ने के लिए संसाधन टैब का उपयोग क्यों नहीं करना चाहूंगा? –

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