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.
}

إنشاء Void لـ IncludeText () ، Visual Studio يقوم بذلك نيابة عنك. انقر فوق Lightbulb إلى AutoGenerate في CodeBlock.

ضع ما يلي داخل كتلة التعليمات البرمجية المنشأة

المورد 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 وإعادته كسلسلة؟ يستخدم البرنامج النصي الحالي الخاص بي نموذج Windows وصندوق النص الذي يسمح للمستخدم بإيجاد واستبدال النص في ملف نصي غير مضمن.

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();
}

أعلم أن هذا أمر قديم ، لكني أردت فقط الإشارة إلى NETMF (.Net MicroFramework) ، يمكنك القيام بذلك بسهولة:

string response = Resources.GetString(Resources.StringResources.MyFileName);

بما أن NETMF لا يحتوي على GetManifestResourceStream


إضافة على سبيل المثال Testfile.sql قائمة المشاريع -> خصائص -> الموارد -> إضافة ملف موجود

    string queryFromResourceFile = Properties.Resources.Testfile.ToString();

إلقاء نظرة على هذه الصفحة: http://support.microsoft.com/kb/319292

بشكل أساسي ، يمكنك استخدام System.Reflection للحصول على مرجع إلى التجميع الحالي. ثم تستخدم GetManifestResourceStream() .

مثال ، من الصفحة التي نشرتها:

ملاحظة : تحتاج إلى إضافة 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!");
   }

شيء تعلمته الآن هو أنه لا يُسمح لملفك بالحصول على "." (نقطة) في اسم الملف.

Templates.plainEmailBodyTemplate-en.txt -> Works !!!
Templates.plainEmailBodyTemplate.en.txt -> لا يعمل عبر GetManifestResourceStream ()

ربما بسبب الخلط بين إطار العمل على مساحات الأسماء وبين اسم الملف ...


عند إضافة الملف إلى الموارد ، يجب عليك تحديد "معدّلات الوصول" الخاصة به على أنها عامة بحيث يمكنك جعل شيء ما كالتالي.

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 هو اسم الملف المضمن.

في الواقع ، يمكنك الانتقال إلى الموارد. Designer.cs ومعرفة ما اسم برنامج getter.


قرأت استخدام ملف نصي مضمن للموارد:

    /// <summary>
    /// Converts to generic list a byte array
    /// </summary>
    /// <param name="content">byte array (embedded resource)</param>
    /// <returns>generic list of strings</returns>
    private List<string> GetLines(byte[] content)
    {
        string s = Encoding.Default.GetString(content, 0, content.Length - 1);
        return new List<string>(s.Split(new[] { Environment.NewLine }, StringSplitOptions.None));
    }

عينة:

var template = GetLines(Properties.Resources.LasTemplate /* resource name */);

template.ForEach(ln =>
{
    Debug.WriteLine(ln);
});

كنت منزعجا أن تضطر دائما إلى تضمين مساحة الاسم والمجلد في السلسلة. كنت أرغب في تبسيط الوصول إلى الموارد المضمنة. هذا هو السبب في أنني كتبت هذا الفصل الصغير. لا تتردد في استخدام وتحسين!

الاستعمال:

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");
        }
    }

}

يمكنك أيضًا استخدام هذه النسخة المبسطة من إجابة @ dtb:

public string GetEmbeddedResource(string ns, string res)
{
    using (var reader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(string.Format("{0}.{1}", ns, res))))
    {
        return reader.ReadToEnd();
    }
}

يمكنك إضافة ملف كمورد باستخدام طريقتين منفصلتين.

يختلف رمز C # المطلوب للوصول إلى الملف ، وفقًا للطريقة المستخدمة لإضافة الملف في المقام الأول.

الطريقة الأولى: إضافة ملف موجود ، قم بتعيين الخاصية إلى " Embedded Resource

قم بإضافة الملف إلى المشروع الخاص بك ، ثم قم بتعيين النوع إلى " Embedded Resource .

ملاحظة: إذا قمت بإضافة الملف باستخدام هذا الأسلوب ، يمكنك استخدام GetManifestResourceStream للوصول إليه (راجع الإجابة من @ dtb).

الطريقة 2: إضافة ملف إلى Resources.resx

افتح ملف Resources.resx ، استخدم مربع القائمة المنسدلة لإضافة الملف ، اضبط Access Modifier على public .

ملاحظة: إذا قمت بإضافة الملف باستخدام هذه الطريقة ، يمكنك استخدام Properties.Resources للوصول إليه (راجع الإجابة من @ Night Walker).





streamreader