संपादित करें: टिम Schmelter से जवाब नंबर 1 पढ़ें और फिर संसाधनों एम्बेड करने के लिए कैसे के उदाहरण के लिए इस सवाल का उपयोग करें और उन्हें रनटाइम पर एक्सेस करते हैं।एंबेडेड संसाधन के बारे में भ्रम Unraveling
एम्बेडेड संसाधनों के विषय को एक बहुत, विशेष रूप से कैसे कार्यावधि में एम्बेडेड फ़ाइलों तक पहुँचने की पूछ लोगों के साथ आता है। चीजें अधिक भ्रमित हो जाती हैं क्योंकि विजुअल स्टूडियो आपको संसाधन को एम्बेड करने के 2 अलग-अलग तरीकों और रनटाइम पर उन संसाधनों तक पहुंचने के विभिन्न तरीकों देता है। समस्या यह है कि संसाधन को एम्बेड करने के लिए उपयोग की जाने वाली विधि के आधार पर, जिस विधि को आप रनटाइम पर फ़ाइल तक पहुंचने के लिए उपयोग करने का प्रयास कर रहे हैं वह काम नहीं कर सकता है। यह पोस्ट उन सभी भ्रम को दूर करने का प्रयास है जो मैं वहां देखता हूं, लेकिन मेरे पास एक सवाल भी है कि कोई भी वास्तव में जवाब देने के लिए प्रतीत नहीं होता है: मेरे संकलित प्रोग्राम का आकार एम्बेडेड संसाधन (कभी-कभी) के आकार को दो बार क्यों है? उदाहरण के लिए यदि मैं अपनी परियोजना में 20 एमबी फ़ाइल एम्बेड करता हूं, तो मेरा प्रोग्राम 40 एमबी तक क्यों संकलित होता है? मैंने अतीत में इस सवाल से पूछा है और कोई भी मेरे परिणामों को पुन: उत्पन्न करने में सक्षम नहीं था। मैंने पाया कि वे पुन: पेश करने में सक्षम नहीं थे क्योंकि वे फ़ाइल को एक अलग तरीके से एम्बेड कर रहे थे। यहाँ देखें:
विधि 1:
संपत्ति पृष्ठों को खोलने और संसाधन टैब पर जाने के लिए मेरी परियोजना पर डबल क्लिक करें। अब संसाधन जोड़ें> मौजूदा फ़ाइल जोड़ें पर क्लिक करें। उस फ़ाइल को ब्राउज़ करें जिसे आप एम्बेड करना चाहते हैं। इस उदाहरण के लिए मैं निष्पादन योग्य का उपयोग कर रहा हूं। अब आप संसाधन टैब पर अपनी फ़ाइल देखेंगे:
तुम भी देखेंगे कि संसाधन नाम का एक फ़ोल्डर अपनी परियोजना के तहत बनाया गया था और एम्बेडेड फ़ाइल इस फ़ोल्डर में रखा गया है:
संपादित करें: अगले चरण में यह समस्या थी। जब आप एक फ़ाइल के माध्यम से एक फ़ाइल जोड़ते हैं तो आपको संसाधनों को एकत्रित करने के लिए तैयार कार्रवाई की आवश्यकता होती है। कम से कम कहने के लिए अंतर्ज्ञानी काउंटर!
अब चयनित फ़ाइल के साथ, फ़ाइल के लिए गुण खिड़की पर नीचे देखो और एंबेडेड संसाधन के निर्माण कार्रवाई बदलने के लिए: (यह चरण ही किया जाना चाहिए जब आप विधि 2 के माध्यम से एक फ़ाइल जोड़ें)।
अब अपने कार्यक्रम संकलन। आप देखेंगे कि आपके संकलित प्रोग्राम का आकार कम से कम आपके एम्बेडेड संसाधन के आकार को दोगुना कर देता है। इस विधि के साथ ऐसा नहीं होता है 2. यहाँ देखें:
विधि 2:
अपने प्रोजेक्ट के नाम पर राइट क्लिक करें और जोड़े> मौजूदा आइटम का चयन करें।
अब एक बार फिर से फ़ाइल का चयन करें और एंबेडेड के लिए कार्रवाई बिल्ड बदलने के लिए: अपनी फ़ाइल के लिए ब्राउज़ करें, और इस बार आप देखेंगे कि जब यह वास्तव में अपनी परियोजना के अंतर्गत रखा गया था, वहाँ कोई संसाधन फ़ोल्डर बनाया था संसाधन और संकलन। इस बार संकलित प्रोग्राम का आकार आपके जैसा अपेक्षित होगा - एम्बेडेड फ़ाइल के आकार के बारे में और विधि 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 क्यों मेरे संकलित प्रोग्राम को अपने आकार को दोगुना करने के लिए, मैं वास्तव में इसकी सराहना करता हूं।
आप बिल्कुल सही हैं। मेरा खुद का भ्रम यह सोच रहा था कि निर्माण कार्य को "एम्बेडेड संसाधन" पर सेट किया जाना चाहिए, भले ही आपने संसाधन टैब के माध्यम से फ़ाइल को जोड़ा हो। मुझे कल्पना है कि यह एक बहुत ही आम गलती है। इसलिए दिया गया है कि My.Resources चीजों को इतना आसान बनाता है, मैं एम्बेडेड संसाधन जोड़ने के लिए संसाधन टैब का उपयोग क्यों नहीं करना चाहूंगा? –