2009-04-07 15 views
7

में बाइनरी संसाधन का उपयोग कैसे करें मैं अपने एप्लिकेशन में संसाधन के रूप में एक खाली एक्सेस डेटाबेस (.mdb) को स्टोर करने का प्रयास कर रहा हूं। मैं फिर इसे फाइल सिस्टम लिखना चाहता हूं और इसे टेबल परिभाषाओं के साथ पॉप्युलेट करना चाहता हूं, आदि। विजुअल स्टूडियो 2005 में मेरी समस्या है और मेरा सी # एप्लिकेशन उसी असेंबली में संग्रहीत संसाधन तक पहुंचने में सक्षम नहीं है (जिसे मैं सोचा होगा डिफ़ॉल्ट रूप से सुलभ होगा)। यहाँ मेरी कोड है:सी # अनुप्रयोग

byte[] abytResource; 
System.Reflection.Assembly objAssembly = System.Reflection.Assembly.GetExecutingAssembly(); 
objStream = objAssembly.GetManifestResourceStream("empty.mdb"); 
abytResource = new Byte[objStream.Length]; 
objStream.Read(abytResource, 0, (int)objStream.Length); 
objFileStream = new FileStream(newDatabasePathWithName, FileMode.Create); 
objFileStream.Write(abytResource, 0, (int)objStream.Length); 
objFileStream.Close(); 

GetManifestResourceStream शून्य और प्रलेखन है कि क्योंकि संसाधन निजी होने चाहिए के अनुसार रिटर्न (क्योंकि भले ही यह अस्तित्व में नहीं है एक गैर-रिक्त मान दिया जाता है)। तो मेरा सवाल यह है:

मैं अपने संसाधन को अपने आवेदन के लिए कैसे सुलभ बना सकता हूं? मैंने इसे पहले ही प्रोजेक्ट में जोड़ा है और इसे "एंबेडेड रिसोर्स" के रूप में चिह्नित किया है।

धन्यवाद!

उत्तर

16

आपको असेंबली के डिफ़ॉल्ट नामस्थान के साथ "blank.mdb" उपसर्ग करने की आवश्यकता है। कुछ की तरह:

objStream = objAssembly.GetManifestResourceStream("My.Namespace.empty.mdb"); 
9

तुम भी

string[] myResources = objAssembly.GetManifestResourceNames(); 
foreach(string reso in myResources) { 
    Console.WriteLine(reso); 
} 

भी लागू करके अपने संसाधनों के नाम जांच कर सकते हैं, अपने empty.mdb फ़ाइल संकलन कार्रवाई पर एंबेडेड संसाधन के साथ चिह्नित है सुनिश्चित करें

alt text http://img520.imageshack.us/img520/6649/sinttuloo.png

1

यह एक बाइनरी एम्बेडेड संसाधन फ़ाइल निकालेगा ...

/// <summary> 
    /// Extracts an embedded file to local file system. 
    /// </summary> 
    /// <param name="resName">Resource name of embedded file. NameSpace.FileName.Extension</param> 
    /// <param name="fileName">Extracted file name</param> 
    public void ExtractEmbeddedFile(string resName, string fileName) 
    { 
     if (File.Exists(fileName)) File.Delete(fileName); 

     Assembly assembly = Assembly.GetExecutingAssembly(); 

     using (var input = assembly.GetManifestResourceStream(resName)) 
     using (var output = File.Open(fileName, FileMode.CreateNew)) 
     { 
      if (input == null) throw new FileNotFoundException(resName + ": Embedded resoure file not found"); 

      var buffer = new byte[32768]; 
      int read; 
      while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       output.Write(buffer, 0, read); 
      } 
      output.Flush(); 
     } 
    } 

यह सी # यूनिट परीक्षणों के लिए बहुत उपयोगी है जिसके लिए डेटा फ़ाइलों की आवश्यकता होती है जहां आपके डीएलएल आमतौर पर मौजूद किसी भी सामग्री फाइल के बिना चलते हैं (वे इकाई परीक्षण ढांचे द्वारा बनाए गए अस्थायी फ़ोल्डर्स में चल सकते हैं)।

इसमें टेक्स्ट फ़ाइलों के लिए एक और कोड स्निपेट है (बाइनरी फाइल नहीं) हालांकि इसमें मेमोरी लीक हो सकती है क्योंकि यह using कथन का उपयोग करने में विफल रही है।

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