c# - एम्बेडेड संसाधन टेक्स्ट फ़ाइल को कैसे पढ़ा जाए




.net embedded-resource (10)

फॉर्म लोड इवेंट पर एंबेडेड TXT फ़ाइल पढ़ें।

गतिशील रूप से चर सेट करें।

string f1 = "AppName.File1.Ext";
string f2 = "AppName.File2.Ext";
string f3 = "AppName.File3.Ext";

एक कोशिश कैच कॉल करें।

try 
{
     IncludeText(f1,f2,f3); 
     /// Pass the Resources Dynamically 
     /// through the call stack.
}

catch (Exception Ex)
{
     MessageBox.Show(Ex.Message);  
     /// Error for if the Stream is Null.
}

IncludeText () के लिए शून्य बनाएं, विजुअल स्टूडियो यह आपके लिए करता है। कोडब्लॉक को स्वत: उत्पन्न करने के लिए लाइटबुल पर क्लिक करें।

जनरेटेड कोड ब्लॉक के अंदर निम्नलिखित रखें

संसाधन 1

var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file1))
using (StreamReader reader = new StreamReader(stream))
{
string result1 = reader.ReadToEnd();
richTextBox1.AppendText(result1 + Environment.NewLine + Environment.NewLine );
}

संसाधन 2

var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file2))
using (StreamReader reader = new StreamReader(stream))
{
string result2 = reader.ReadToEnd();
richTextBox1.AppendText(
result2 + Environment.NewLine + 
Environment.NewLine );
}

संसाधन 3

var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file3))

using (StreamReader reader = new StreamReader(stream))
{
    string result3 = reader.ReadToEnd();
    richTextBox1.AppendText(result3);
}

यदि आप कहीं और लौटा चर भेजना चाहते हैं, तो बस एक और फ़ंक्शन कॉल करें और ...

using (StreamReader reader = new StreamReader(stream))
{
    string result3 = reader.ReadToEnd();
    ///richTextBox1.AppendText(result3);
    string extVar = result3;

    /// another try catch here.

   try {

   SendVariableToLocation(extVar)
   {
         //// Put Code Here.
   }

       }

  catch (Exception ex)
  {
    Messagebox.Show(ex.Message);
  }

}

यह क्या हासिल किया गया था, एक से अधिक समृद्ध टेक्स्ट बॉक्स के अंदर, कई txt फ़ाइलों को गठबंधन करने और उनके एम्बेडेड डेटा को पढ़ने का एक तरीका था। जो संहिता के इस नमूने के साथ मेरा वांछित प्रभाव था।

StreamReader का उपयोग करके मैं एक एम्बेडेड संसाधन (टेक्स्ट फ़ाइल) कैसे StreamReader और इसे स्ट्रिंग के रूप में वापस कैसे करूं? मेरी वर्तमान स्क्रिप्ट एक विंडोज़ फॉर्म और टेक्स्टबॉक्स का उपयोग करती है जो उपयोगकर्ता को टेक्स्ट फ़ाइल में टेक्स्ट ढूंढने और बदलने की अनुमति देती है जो एम्बेडेड नहीं है।

private void button1_Click(object sender, EventArgs e)
{
    StringCollection strValuesToSearch = new StringCollection();
    strValuesToSearch.Add("Apple");
    string stringToReplace;
    stringToReplace = textBox1.Text;

    StreamReader FileReader = new StreamReader(@"C:\MyFile.txt");
    string FileContents;
    FileContents = FileReader.ReadToEnd();
    FileReader.Close();
    foreach (string s in strValuesToSearch)
    {
        if (FileContents.Contains(s))
            FileContents = FileContents.Replace(s, stringToReplace);
    }
    StreamWriter FileWriter = new StreamWriter(@"MyFile.txt");
    FileWriter.Write(FileContents);
    FileWriter.Close();
}

आप Assembly.GetManifestResourceStream उपयोग कर सकते हैं। Assembly.GetManifestResourceStream विधि :

  1. निम्नलिखित उपयोग जोड़ें

    using System.IO;
    using System.Reflection;
    
  2. प्रासंगिक फ़ाइल की संपत्ति सेट करें:
    मूल्य Embedded Resource साथ पैरामीटर Build Action

  3. निम्नलिखित कोड का प्रयोग करें

var assembly = Assembly.GetExecutingAssembly();
var resourceName = "MyCompany.MyProduct.MyFile.txt";

using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
    string result = reader.ReadToEnd();
}

resourceName नाम assembly में एम्बेडेड संसाधनों में से एक का नाम है। उदाहरण के लिए, यदि आप "MyCompany.MyProduct" नामक एक टेक्स्ट फ़ाइल एम्बेड करते हैं जो डिफ़ॉल्ट नामस्थान "MyCompany.MyProduct" साथ किसी प्रोजेक्ट की रूट में रखी गई है, तो resourceName नाम "MyCompany.MyProduct.MyFile.txt" । आप विधानसभा का उपयोग कर Assembly.GetManifestResourceNames में सभी संसाधनों की एक सूची प्राप्त कर सकते हैं। Assembly.GetManifestResourceNames विधि


आप दो अलग-अलग विधियों का उपयोग कर संसाधन के रूप में एक फ़ाइल जोड़ सकते हैं।

फाइल को एक्सेस करने के लिए उपयोग की जाने वाली विधि के आधार पर फ़ाइल तक पहुंचने के लिए आवश्यक सी # कोड अलग है।

विधि 1: मौजूदा फ़ाइल जोड़ें, Embedded Resource संपत्ति सेट करें

फ़ाइल को अपनी प्रोजेक्ट में जोड़ें, फिर Embedded Resource में टाइप करें।

नोट: यदि आप इस विधि का उपयोग कर फ़ाइल जोड़ते हैं, तो आप इसे प्राप्त करने के लिए GetManifestResourceStream का उपयोग कर सकते हैं (@dtb से उत्तर देखें)।

विधि 2: Resources.resx फ़ाइल जोड़ें

Resources.resx फ़ाइल खोलें, फ़ाइल जोड़ने के लिए ड्रॉपडाउन बॉक्स का उपयोग करें, public से Access Modifier सेट करें।

नोट: यदि आप इस विधि का उपयोग कर फ़ाइल जोड़ते हैं, तो आप इसका उपयोग करने के लिए Properties.Resources का उपयोग कर सकते हैं (@ नाइट वाकर से उत्तर देखें)।


इस पृष्ठ पर एक नज़र डालें: http://support.microsoft.com/kb/319292

असल में, आप मौजूदा असेंबली का संदर्भ प्राप्त करने के लिए System.Reflection का उपयोग करते हैं। फिर, आप GetManifestResourceStream() उपयोग करते हैं।

उदाहरण, मैंने पोस्ट किए गए पृष्ठ से:

नोट : using System.Reflection; करने की आवश्यकता है using System.Reflection; इसके लिए काम करने के लिए

   Assembly _assembly;
   StreamReader _textStreamReader;

   try
   {
      _assembly = Assembly.GetExecutingAssembly();
      _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
   }
   catch
   {
      MessageBox.Show("Error accessing resources!");
   }

जब आपने संसाधनों में फ़ाइल को जोड़ा, तो आपको इसके एक्सेस मॉडिफायर को सार्वजनिक के रूप में चुनना चाहिए ताकि आप कुछ ऐसा कर सकें।

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 एम्बेडेड फ़ाइल का नाम है।

असल में आप संसाधनों पर जा सकते हैं। डिज़ाइनर सीएस और देखें कि गेटर का नाम क्या है।


मुझे पता है कि यह एक पुराना धागा है, लेकिन यह मेरे लिए काम करता है:

  1. प्रोजेक्ट संसाधनों में टेक्स्ट फ़ाइल जोड़ें
  2. एंड्रयू हिल द्वारा ऊपर दिखाए गए अनुसार, जनता के लिए एक्सेस संशोधक सेट करें
  3. इस तरह के पाठ को पढ़ें:

    textBox1 = new TextBox();
    textBox1.Text = Properties.Resources.SomeText;
    

पाठ जो मैंने संसाधनों में जोड़ा था: 'SomeText.txt'


मैं नाराज था कि आपको हमेशा स्ट्रिंग में नामस्थान और फ़ोल्डर शामिल करना था। मैं एम्बेडेड संसाधनों तक पहुंच को सरल बनाना चाहता था। यही कारण है कि मैंने इस छोटी कक्षा को लिखा था। उपयोग करने और सुधारने के लिए स्वतंत्र महसूस करें!

उपयोग:

using(Stream stream = EmbeddedResources.ExecutingResources.GetStream("filename.txt"))
{
 //...
}

वर्ग:

public class EmbeddedResources
{

    public static EmbeddedResources callingResources;

    public static EmbeddedResources entryResources;

    public static EmbeddedResources executingResources;

    private Assembly assembly;

    private string[] resources;

    public static EmbeddedResources CallingResources
    {
        get
        {
            if (callingResources == null)
            {
                callingResources = new EmbeddedResources(Assembly.GetCallingAssembly());
            }

            return callingResources;
        }
    }

    public static EmbeddedResources EntryResources
    {
        get
        {
            if (entryResources == null)
            {
                entryResources = new EmbeddedResources(Assembly.GetEntryAssembly());
            }

            return entryResources;
        }
    }

    public static EmbeddedResources ExecutingResources
    {
        get
        {
            if (executingResources == null)
            {
                executingResources = new EmbeddedResources(Assembly.GetExecutingAssembly());
            }

            return executingResources;
        }
    }

    public EmbeddedResources(Assembly assembly)
    {
        this.assembly = assembly;
        resources = assembly.GetManifestResourceNames();
    }

    public Stream GetStream(string resName)
    {
        string[] possibleCandidates = resources.Where(s => s.Contains(resName)).ToArray();
        if (possibleCandidates.Length == 0)
        {
            return null;
        }
        else if (possibleCandidates.Length == 1)
        {
            return assembly.GetManifestResourceStream(possibleCandidates[0]);
        }
        else
        {
            throw new ArgumentException("Ambiguous name, cannot identify resource", "resName");
        }
    }

}

मैंने अभी कुछ सीखा है कि आपकी फाइल को "।" (डॉट) फ़ाइल नाम में।

Templates.plainEmailBodyTemplate-en.txt -> काम करता है !!!
Templates.plainEmailBodyTemplate.en.txt -> GetManifestResourceStream () के माध्यम से काम नहीं करता है

संभवतः क्योंकि फ्रेमवर्क नामस्थान बनाम फ़ाइल नाम पर भ्रमित हो जाता है ...


यहां पोस्ट किए गए सभी समाधान पढ़ने के बाद। इस तरह मैंने इसे हल किया:

// How to embedded a "Text file" inside of a C# project
//   and read it as a resource from c# code:
//
// (1) Add Text File to Project.  example: 'myfile.txt'
//
// (2) Change Text File Properties:
//      Build-action: EmbeddedResource
//      Logical-name: myfile.txt      
//          (note only 1 dot permitted in filename)
//
// (3) from c# get the string for the entire embedded file as follows:
//
//     string myfile = GetEmbeddedResourceFile("myfile.txt");

public static string GetEmbeddedResourceFile(string filename) {
    var a = System.Reflection.Assembly.GetExecutingAssembly();
    using (var s = a.GetManifestResourceStream(filename))
    using (var r = new System.IO.StreamReader(s))
    {
        string result = r.ReadToEnd();
        return result;
    }
    return "";      
}

विजुअल स्टूडियो में आप प्रोजेक्ट गुणों के संसाधन टैब (इस उदाहरण में "Analytics") के माध्यम से सीधे फ़ाइल संसाधन तक पहुंच एम्बेड कर सकते हैं।

परिणामस्वरूप फ़ाइल को तब बाइट सरणी के रूप में एक्सेस किया जा सकता है

byte[] jsonSecrets = GoogleAnalyticsExtractor.Properties.Resources.client_secrets_reporter;

क्या आपको इसे स्ट्रीम के रूप में चाहिए, फिर ( https://.com/a/4736185/432976 )

Stream stream = new MemoryStream(jsonSecrets)




streamreader