এমবেডেড রিসোর্স টেক্সট ফাইলটি কীভাবে পড়বেন


693

আমি কীভাবে একটি এম্বেডেড রিসোর্স (পাঠ্য ফাইল) পড়ব 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();
}

উত্তর:


1194

আপনি Assembly.GetManifestResourceStreamপদ্ধতিটি ব্যবহার করতে পারেন :

  1. নিম্নলিখিত usings যোগ করুন

    using System.IO;
    using System.Reflection;
    
  2. প্রাসঙ্গিক ফাইলের সম্পত্তি সেট করুন: মান সহ
    প্যারামিটারBuild ActionEmbedded Resource

  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। উদাহরণস্বরূপ, যদি আপনি নামে একটি টেক্সট ফাইল এম্বেড "MyFile.txt"ডিফল্ট নামস্থান সঙ্গে একটি প্রকল্পের root- র মধ্যে স্থাপন করা হয় "MyCompany.MyProduct", তারপর resourceNameহয় "MyCompany.MyProduct.MyFile.txt"। আপনি একটি সমাবেশ ব্যবহারে সব সম্পদের একটি তালিকা পেতে পারেন Assembly.GetManifestResourceNamesপদ্ধতি


resourceNameকেবলমাত্র ফাইলের নাম থেকে নামটি পাওয়ার জন্য কোনও ব্রেইনার অ্যাস্টুটেট না (নামস্টেস স্টাফ দিয়ে পাস করুন):

string resourceName = assembly.GetManifestResourceNames()
  .Single(str => str.EndsWith("YourFileName.txt"));

একটি সম্পূর্ণ উদাহরণ:

public string ReadResource(string name)
{
    // Determine path
    var assembly = Assembly.GetExecutingAssembly();
    string resourcePath = name;
    // Format: "{Namespace}.{Folder}.{filename}.{Extension}"
    if (!name.StartsWith(nameof(SignificantDrawerCompiler)))
    {
        resourcePath = assembly.GetManifestResourceNames()
            .Single(str => str.EndsWith(name));
    }

    using (Stream stream = assembly.GetManifestResourceStream(resourcePath))
    using (StreamReader reader = new StreamReader(stream))
    {
        return reader.ReadToEnd();
    }
}

5
@ মি.ক্লোজ: Environment.SpecialFolderডেস্কটপ ফোল্ডারটি দেখতে একবার দেখুন । আপনার মনে রাখতে হবে যে প্রকল্পের মধ্যে থাকা পথের উপর ভিত্তি করে এই সংস্থানটির নাম গতি হবে, সুতরাং এর নামটি ঠিক নাও হতে পারে file1.txt
শে

15
GetManifestResourceStream@ অ্যাড্রিয়ান হিসাবে ইঙ্গিত হিসাবে পথের জন্য যুক্তিটি দরকার। এটা যে কেউ সহায়তা করেন, তাহলে সেই পথ উদাহরণে কি @SimpleCoder শো মত হল: MyNamespace.Filename.Ext। আমি আগে চেষ্টা করেছিলাম MyNamespace.Resources.Filename.Extকিন্তু ফলাফলটি বাতিল হয়ে যায়।
জেইল্টন

61
যদি আপনার সংস্থানটি সরাসরি প্রকল্পের মূলের মধ্যে না থাকে তবে কিছু সাবফোল্ডারে থাকে তবে এই ফোল্ডারটির নামটি রিসোর্সনেমেও রাখতে ভুলবেন না (যেমন "মাইপ্রজেক্টনেমস্পেস Mমাইপ্রজেক্টসুবফোল্ডার F ফাইলনেম। ফাইল এক্সটেনশন")
সাশা

19
রিসোর্স "বিল্ড অ্যাকশন" সেটাকে "এম্বেডেড রিসোর্স" হিসাবে সেট করতে হবে
ইলিদান

7
একটি গুরুত্বপূর্ণ বিষয় এখানে আচ্ছাদিত করা হয় নি। বিজোড় অক্ষরগুলি মোকাবেলায় আপনি যদি বিকল্পটি এনকোডিং টাইপ হিসাবে আপনার ফাইলটি সংরক্ষণ করেন (আমার ক্ষেত্রে ইউটিএফ 8), আপনি যখন স্ট্রিমটি পড়েন তখন খালি ফাইল ফিরে পেতে পারেন। স্ট্রিম রিডারের কনস্ট্রাক্টরে এনকোডিং টাইপ নির্দিষ্ট করে এটি ঠিক করুন:using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
গতিময়

139

দুটি পৃথক পদ্ধতি ব্যবহার করে আপনি কোনও ফাইলকে সংস্থান হিসাবে যুক্ত করতে পারেন।

ফাইলটি অ্যাক্সেসের জন্য প্রয়োজনীয় সি # কোডটি পৃথক , ফাইলটি প্রথমে যুক্ত করার পদ্ধতিটির উপর নির্ভর করে।

পদ্ধতি 1: বিদ্যমান ফাইল যুক্ত করুন, এতে সম্পত্তি সেট করুন Embedded Resource

আপনার প্রকল্পে ফাইল যুক্ত করুন, তারপরে টাইপটি সেট করুন Embedded Resource

দ্রষ্টব্য: আপনি যদি এই পদ্ধতিটি ব্যবহার করে ফাইলটি যুক্ত করেন তবে আপনি GetManifestResourceStreamএটি অ্যাক্সেস করতে ব্যবহার করতে পারেন ( @dtb এর উত্তর দেখুন )।

এখানে চিত্র বর্ণনা লিখুন

পদ্ধতি 2: এতে ফাইল যুক্ত করুন Resources.resx

খুলুন Resources.resxফাইল, ফাইল যোগ করার জন্য, সেট ড্রপডাউন বক্স ব্যবহার Access Modifierকরতে public

দ্রষ্টব্য: আপনি যদি এই পদ্ধতিটি ব্যবহার করে ফাইলটি যুক্ত করেন তবে আপনি Properties.Resourcesএটি অ্যাক্সেস করতে ব্যবহার করতে পারেন ( @ নাইট ওয়াকারের উত্তর দেখুন )।

এখানে চিত্র বর্ণনা লিখুন


5
তৃতীয় পদ্ধতিটি হ'ল প্রকল্পটিতে ফাইল যুক্ত করা, তারপরে "অনুলিপি ডিরেক্টরিতে অনুলিপি করুন" "সত্য" এ সেট করুন। সংকলনের সময়, ফাইলটি আউটপুট ডায়ারে অনুলিপি করা হয় এবং আপনি সাধারণ উপায় ব্যবহার করে ফাইলটি পড়তে পারেন। উদাহরণ: আপনি যখন কোনও চিত্র প্রদর্শন করতে চান তখন একটি ডাব্লুপিএফ অ্যাপে in
কনটাঙ্গো

সুতরাং বিল্ড অ্যাকশনটি সেট করা Resourceকি এমন কিছু করে না যা আপনাকে কোনও উত্স হিসাবে আইটেমটি পড়তে দেয়? আপনি EmbeddedResourceএকটি Resources.resxফাইল ব্যবহার বা যুক্ত করতে হবে?
মাসলো

3
@ ম্যাসলো 'রিসোর্স'-এ বিল্ড অ্যাকশনটি সেট করা একটি সংযুক্ত সংস্থান তৈরি করে, যেখানে' এম্বেডেড রিসোর্স 'এ বিল্ড অ্যাকশন সেট করে আউটপুট অ্যাসেমব্লিকে সংস্থান করে। 'সংযুক্ত সংস্থান' শব্দটি 'সংকলনের আউটপুট ডিরেক্টরিতে ফাইলটি অনুলিপি করার' জন্য অভিনব শব্দ (আপনি কোনও সাধারণ পদ্ধতি ব্যবহার করে রানটাইমে ফাইলটি পড়তে পারেন)। এই দুটি ধরণের পার্থক্যের জন্য আরও জানুন, এমএসডিএন.মাইক্রোসফটকম /en-us/library/7k989cfy(vvv..90).aspx এ সংস্থান এবং সম্পাদনা সংস্থান (ভিজ্যুয়াল সি #) দেখুন ।
কনটাঙ্গো

আপনি সেই সমস্ত সম্পদের এই ভাবে ব্যবহার করতে চান, কিন্তু তাহলে পরিবর্তনশীল, এই মাত্র পরিবর্তে: Properties.Resources.Your_resource_name এই লিখুন: Properties.Resources.ResourceManager.GetObject("Your_resource_name")
Lkor

86

মূলত, আপনি System.Reflectionবর্তমান সমাবেশে একটি রেফারেন্স পেতে ব্যবহার করেন use তারপরে, আপনি ব্যবহার করুন 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!");
   }

32
+1 namespaceরিসোর্স নামের অংশ হিসাবে অন্তর্ভুক্ত করার জন্য
কર્ક ব্রডহર્স্ট

41
var auxList= System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); আপনি সঠিক সংস্থার নাম জানতে চাইলে এই পদ্ধতিটি খুব কার্যকর হতে পারে। (প্রশ্ন স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 27757/… থেকে নেওয়া )
অস্কার ফোলি

69

ভিজ্যুয়াল স্টুডিওতে আপনি প্রকল্পের সম্পত্তিগুলির রিসোর্স ট্যাব (এই উদাহরণে "অ্যানালিটিক্স") এর মাধ্যমে কোনও ফাইল সংস্থায় সরাসরি অ্যাক্সেস এম্বেড করতে পারেন। ভিজ্যুয়াল স্টুডিও স্ক্রিন শট - সংস্থানসমূহ ট্যাব

ফলস্বরূপ ফাইলটি তখন বাইট অ্যারে হিসাবে অ্যাক্সেস করতে পারে

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

আপনার যদি স্ট্রিম হিসাবে এটির দরকার হয়, তবে ( https://stackoverflow.com/a/4736185/432976 থেকে )

Stream stream = new MemoryStream(jsonSecrets)

11
আপনি এটি কোনও পাঠ্য ফাইলের সাহায্যেও ব্যবহার করতে পারেন, সেই ক্ষেত্রে আপনার কাছে যা হবে: স্ট্রিং জসনসেক্রেটস = আপনার নামসস্পেস.প্রোপার্টি.সংশ্লিষ্ট.আপনার ফাইলনাম;
আউটফ্লাক করুন

30

আপনি যখন ফাইলগুলিকে সংস্থানগুলিতে যুক্ত করেছেন, নীচের মতো কিছু তৈরি করার চেয়ে আপনার এর অ্যাক্সেস পরিবর্তনকারীকে সর্বজনীন হিসাবে নির্বাচন করা উচিত select

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 এম্বেড করা ফাইলের নাম।

আসলে আপনি রিসোর্সগুলিতে যেতে পারেন es ডিজাইনার.cs এবং দেখুন যে নামটির নাম।


5
আপনি এই আরও ব্যাখ্যা করতে পারেন? আমি যখন সমাধান এক্সপ্লোরারের কোনও ফাইলটিতে ডান-ক্লিক করুন-> বৈশিষ্ট্যগুলি নির্ধারণ করি এবং তারপরে সেট করে Actionরাখি Incorporated ressource, Access Modifiersতবে বৈশিষ্ট্য প্যানেলে আমার কোনও ক্ষেত্র নেই। এছাড়াও, আমার কোনও Propersites.Resourcesক্লাস নেই, The name 'Properties' does not exist in the current contextআপনার কোডটি সংকলন করার সময় আমি একটি ত্রুটি পাই ।
সুজান ডুপোরন

2
এটি কেবল তখনই কাজ করবে যদি আপনি ফাইলটি এম্বেড করেন Resources.resx, কোনও প্রকল্পে ফাইল এম্বেড করার জন্য বিভিন্ন পদ্ধতিতে আমার উত্তর দেখুন।
কনটাঙ্গো

13

উদাহরণস্বরূপ টেস্টফিল.এসকিউএল প্রকল্প মেনু -> সম্পত্তি -> সংস্থানসমূহ -> বিদ্যমান ফাইল যুক্ত করুন adding

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

এখানে চিত্র বর্ণনা লিখুন


2
এটা তোলে বাইট [] ফিরে আসবে, টেক্সট ফাইলে `ব্যবহার Encoding.UTF8.GetString (Properties.Resources.Testfile)`
MikeTheCoder

12

আমি জানি এটি একটি পুরানো থ্রেড, তবে এটি আমার জন্য কাজ করেছিল:

  1. প্রকল্পের সংস্থানগুলিতে পাঠ্য ফাইল যুক্ত করুন
  2. অ্যান্ড্রু হিলের উপরে যেমন দেখানো হয়েছে, অ্যাক্সেস মডিফায়ারটিকে সর্বজনীনতে সেট করুন
  3. এই লেখাটি পড়ুন:

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

সংস্থানগুলিতে আমি যে পাঠ্যটি যুক্ত করেছি: 'SomeText.txt'


8

আপনি @ ডিটিবি'র উত্তরের এই সরলীকৃত সংস্করণটিও ব্যবহার করতে পারেন:

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

আপনি কি এ ব্যাপারে নিশ্চিত? এই এই লিঙ্কে অনুযায়ী এটা দেখে মনে হচ্ছে আমি .... stackoverflow.com/questions/1065168/...
Timmerz

8

আমি এখনই শিখেছি এমন কিছু যা আপনার ফাইলটিতে "থাকার অনুমতি নেই।" (বিন্দু) ফাইলের নাম।

ক "।"  ফাইলের নাম ভাল হয় না।

টেমপ্লেটস.প্লেইন ইমেইলবিডিটিম্পলেট-en.txt -> ওয়ার্কস !!!
টেমপ্লেটস.প্লেইনমেলবিডিটিম্পলেট.ইন টেক্সট -> গেটম্যানিয়েস্টের রিসোর্সস্ট্রিমের মাধ্যমে কাজ করে না ()

সম্ভবত কারণ কাঠামোটি ফাইল-নাম বনাম নেমস্পেসগুলিতে বিভ্রান্ত হয়ে পড়েছে ...


3
দুঃখিত। এটা ভুল. বিন্দু কাজ। (কমপক্ষে এটি আমার জন্য কার্যকর হয়েছিল, নেট 4.5) আপনার কেন এই বাগটি ছিল তা আমি জানি না।
ফেলিক্স কেইল

হ্যাঁ তারা কাজ করে তবে তারা ডিরেক্টরি বিভাজক হিসাবে কাজ করে। টেমপ্লেটস.প্লেইনইমেলবডিটিম্পলেট.ইন টেক্সট "\ টেমপ্লেটস \ প্লেইন ইমেলবডিটিম্পলেট \ en.txt" রিসোর্সটি খুঁজবে
পিটার গ্যাফাদার

না, আমি চেষ্টা করেছিলাম। গেটম্যানিয়েস্টের রিসোর্সস্ট্রিম ফাইলনামে একাধিক ডট সহ এম্বেড থাকা সংস্থানগুলিতে অ্যাক্সেস করতে পারে। (নেট 4.5)
ফেলিক্স কেইল

1
.NET 4.5 এ আমার একই সমস্যা ছিল। নামে বিন্দুযুক্ত ফাইলগুলি সংস্থান সংগ্রহের সাথে যোগ করা হয়নি। পদ্ধতি সমাবেশ.গেটমেনিফিসার রিসোর্সনাম () আমাকে খালি তালিকা ফিরিয়ে দেয় Lএছাড়া আমি খুঁজে পেয়েছি যে সমস্যাটি কেবল ভাষা কোডের সাথেই ছিল। ca.abcd.sk.crt কোনও সংস্থান ছাড়াই সংযুক্ত করা হয়েছিল এবং ca.abcd.crt সংস্থানগুলিতে যুক্ত করা হয়নি।
a.farkas2508

1
2020-এ এখনও ঠিক this
জেরেমেজ

8

আপনার সমস্ত ক্ষমতা সম্মিলিতভাবে আমি কোনও জেনারিক উপায়ে যে কোনও সমাবেশ এবং যেকোন নেমস্পেসের সংস্থানগুলি পড়ার জন্য এই সহায়ক শ্রেণীটি ব্যবহার করি।

public class ResourceReader
{
    public static IEnumerable<string> FindEmbededResources<TAssembly>(Func<string, bool> predicate)
    {
        if (predicate == null) throw new ArgumentNullException(nameof(predicate));

        return
            GetEmbededResourceNames<TAssembly>()
                .Where(predicate)
                .Select(name => ReadEmbededResource(typeof(TAssembly), name))
                .Where(x => !string.IsNullOrEmpty(x));
    }

    public static IEnumerable<string> GetEmbededResourceNames<TAssembly>()
    {
        var assembly = Assembly.GetAssembly(typeof(TAssembly));
        return assembly.GetManifestResourceNames();
    }

    public static string ReadEmbededResource<TAssembly, TNamespace>(string name)
    {
        if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
        return ReadEmbededResource(typeof(TAssembly), typeof(TNamespace), name);
    }

    public static string ReadEmbededResource(Type assemblyType, Type namespaceType, string name)
    {
        if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType));
        if (namespaceType == null) throw new ArgumentNullException(nameof(namespaceType));
        if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));

        return ReadEmbededResource(assemblyType, $"{namespaceType.Namespace}.{name}");
    }

    public static string ReadEmbededResource(Type assemblyType, string name)
    {
        if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType));
        if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));

        var assembly = Assembly.GetAssembly(assemblyType);
        using (var resourceStream = assembly.GetManifestResourceStream(name))
        {
            if (resourceStream == null) return null;
            using (var streamReader = new StreamReader(resourceStream))
            {
                return streamReader.ReadToEnd();
            }
        }
    }
}

3
অধিনায়ক গ্রহের জন্য প্লাস ওয়ান: পি
অলোক

4

আমি এমবেডেড রিসোর্স টেক্সট ফাইল ব্যবহার পড়ি:

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

3

আমি জানি এই পুরোনো, কিন্তু আমি ঠিক বাতলান চেয়েছিলেন NETMF (নেট MicroFramework), আপনি সহজেই এটা করতে পারেন:

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

যেহেতু NETMF নেইGetManifestResourceStream


3

এখানে পোস্ট সমস্ত সমাধান পড়ার পরে। এইভাবে আমি এটি সমাধান করেছি:

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

3

উত্তরটি বেশ সহজ, আপনি যদি সরাসরি উত্স.resx থেকে ফাইলটি যুক্ত করেন তবে কেবল এটি করুন।

string textInResourceFile = fileNameSpace.Properties.Resources.fileName;

কোডটির এই লাইনের সাথে ফাইল থেকে পাঠ্যটি সরাসরি ফাইল থেকে পঠিত হয় এবং স্ট্রিং ভেরিয়েবলের মধ্যে রাখা হয়।


2

আমি বিরক্ত হয়েছিলাম যে আপনাকে সর্বদা স্ট্রিংয়ের মধ্যে নামস্থান এবং ফোল্ডারটি অন্তর্ভুক্ত করতে হবে। আমি এম্বেড থাকা সংস্থানগুলিতে অ্যাক্সেসকে সহজ করতে চেয়েছিলাম। এই কারণেই আমি এই ছোট্ট ক্লাসটি লিখেছি। নির্দ্বিধায় ব্যবহার করুন এবং উন্নত করুন!

ব্যবহার:

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

ক্লাস:

public class EmbeddedResources
{
    private static readonly Lazy<EmbeddedResources> _callingResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetCallingAssembly()));

    private static readonly Lazy<EmbeddedResources> _entryResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetEntryAssembly()));

    private static readonly Lazy<EmbeddedResources> _executingResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetExecutingAssembly()));

    private readonly Assembly _assembly;

    private readonly string[] _resources;

    public EmbeddedResources(Assembly assembly)
    {
        _assembly = assembly;
        _resources = assembly.GetManifestResourceNames();
    }

    public static EmbeddedResources CallingResources => _callingResources.Value;

    public static EmbeddedResources EntryResources => _entryResources.Value;

    public static EmbeddedResources ExecutingResources => _executingResources.Value;

    public Stream GetStream(string resName) => _assembly.GetManifestResourceStream(_resources.Single(s => s.Contains(resName)));

}

1
এবং অতি সাধারণ সমাধান সম্পর্কে কী: var resName = সমাবেশ.GetManLiveResourceNames () ource যেখানে (i => i.EndWith (ফাইলের নাম)) First আপনি যদি পুরো ডিরেক্টরিগুলি সমাবেশে
হ্যারি

@ তাড়াতাড়ি নিশ্চিত যে আপনি এটি করতে পারেন। এটি আমার উত্তরের সাথে কীভাবে সম্পর্কযুক্ত? আপনি কি গেটস্ট্রিম পদ্ধতিটি উন্নত করতে চান? এবং আপনি কিভাবে অস্পষ্টতা পরিচালনা করবেন?
ফেলিক্স কেয়েল

1
@ ইস্তেভেজ সিস্টেম ব্যবহার করে; System.IO ব্যবহার করে; System.Linq ব্যবহার করে; সিস্টেম.রিফ্লেশন ব্যবহার করে;
ফেলিক্স কেইল

2
অন্য কোনও প্রকল্পে স্থাপন করার সময় কোনও কারণে ক্লাস কাজ করে না। আহ্বান করা এবং কার্য সম্পাদন করা উভয়ই এই শ্রেণীর সাথে অ্যাসেমব্লিকে বোঝায়, প্রকৃতপক্ষে পরীক্ষা চালায় এমন নয় one স্থির এবং অলস সূচনা ছাড়া সব ভাল, না।
কোঁকড়া ধনুর্বন্ধনী

1
ধন্যবাদ অলস মূল্যায়ন এই উত্তরের একটি বাস্তব ত্রুটি, কারণ আহ্বান ও সম্পাদনকারী সমাবেশগুলি প্রসঙ্গে নির্ভর করে পরিবর্তিত হয়। প্রতিটি অ্যাক্সেসে তাদের সমাধান করা দরকার।
ফেলিক্স কেয়েল

2

কিছু ভিএস। নেট প্রকল্পের ধরণগুলি .NET (.resx) ফাইলটি স্বয়ংক্রিয়ভাবে উত্পন্ন করে না। নিম্নলিখিত পদক্ষেপগুলি আপনার প্রকল্পে একটি সংস্থান ফাইল যুক্ত করে:

  1. প্রকল্প নোডটিতে ডান ক্লিক করুন এবং অ্যাড / নতুন আইটেম নির্বাচন করুন, সংস্থানসমূহ ফাইলটিতে স্ক্রোল করুন। নাম বাক্সে একটি উপযুক্ত নাম চয়ন করুন, উদাহরণস্বরূপ সংস্থানসমূহ এবং অ্যাড বোতামটি ক্লিক করুন।
  2. রিসোর্স.আরেক্স ফাইলটি প্রোজেক্টে যুক্ত করা হয়েছে এবং সমাধান এক্সপ্লোরারটিতে নোড হিসাবে দেখা যেতে পারে।
  3. প্রকৃতপক্ষে, দুটি ফাইল তৈরি করা হয়, সেখানে একটি স্বয়ংক্রিয় উত্পন্ন সি # শ্রেণি রিসোর্স.ডিজাইনার.সিও রয়েছে। এটি সম্পাদনা করবেন না, এটি ভিএস দ্বারা রক্ষণাবেক্ষণ করা হয় ফাইলটিতে একটি শ্রেণি রয়েছে Resources

এখন আপনি কোনও উত্স হিসাবে একটি পাঠ্য ফাইল যুক্ত করতে পারেন, উদাহরণস্বরূপ একটি এক্সএমএল ফাইল:

  1. রিসোর্স.আরেক্স-এ ডাবল ক্লিক করুন। সংস্থান যোগ করুন নির্বাচন করুন> বিদ্যমান ফাইল যুক্ত করুন এবং আপনি যে ফাইলটি অন্তর্ভুক্ত হতে চান তাতে স্ক্রোল করুন। অ্যাক্সেস পরিবর্তনের জন্য ডিফল্ট মান অভ্যন্তরীণ ছেড়ে যান।
  2. একটি আইকন নতুন সংস্থান আইটেম উপস্থাপন করে। যদি নির্বাচিত হয়, সম্পত্তি ফলকটি তার বৈশিষ্ট্যগুলি দেখায়। এক্সএমএল ফাইলের জন্য, এনকোডিংয়ের সম্পত্তি অনুসারে ইউনিকোড (ইউটিএফ -8) - ডিফল্ট স্থানীয় কোডপেজের পরিবর্তে কোডপেজ 65001 নির্বাচন করুন। অন্যান্য পাঠ্য ফাইলের জন্য এই ফাইলটির সঠিক এনকোডিং নির্বাচন করুন, উদাহরণস্বরূপ কোডেপজ 1252।
  3. এক্সএমএল ফাইলের মতো পাঠ্য ফাইলগুলির জন্য, শ্রেণীর Resourcesএকটি ধরণের সম্পত্তি রয়েছে stringযা অন্তর্ভুক্ত ফাইলের নামে নামকরণ করা হয়। যদি ফাইলটির নাম যেমন রিবনম্যানিয়েস্ট.এক্সএমএল হয় তবে সম্পত্তিটির নাম থাকা উচিত RibbonManifest। আপনি রিসোর্স.ডিজাইনার.এস কোড ফাইলটিতে সঠিক নামটি খুঁজে পান।
  4. উদাহরণস্বরূপ অন্য কোন স্ট্রিং সম্পত্তি মত স্ট্রিং সম্পত্তি ব্যবহার করুন: string xml = Resources.RibbonManifest। সাধারণ ফর্ম হয় ResourceFileName.IncludedTextFileNameResourceManager.GetStringস্ট্রিং সম্পত্তিটির গেট-ফাংশন যেহেতু এটি ইতিমধ্যে হয়ে গেছে তা ব্যবহার করবেন না ।

1
public class AssemblyTextFileReader
{
    private readonly Assembly _assembly;

    public AssemblyTextFileReader(Assembly assembly)
    {
        _assembly = assembly ?? throw new ArgumentNullException(nameof(assembly));
    }

    public async Task<string> ReadFileAsync(string fileName)
    {
        var resourceName = _assembly.GetManifestResourceName(fileName);

        using (var stream = _assembly.GetManifestResourceStream(resourceName))
        {
            using (var reader = new StreamReader(stream))
            {
                return await reader.ReadToEndAsync();
            }
        }
    }
}

public static class AssemblyExtensions
{
    public static string GetManifestResourceName(this Assembly assembly, string fileName)
    {
        string name = assembly.GetManifestResourceNames().SingleOrDefault(n => n.EndsWith(fileName, StringComparison.InvariantCultureIgnoreCase));

        if (string.IsNullOrEmpty(name))
        {
            throw new FileNotFoundException($"Embedded file '{fileName}' could not be found in assembly '{assembly.FullName}'.", fileName);
        }

        return name;
    }
}

0

এটি এমন একটি শ্রেণী যা আপনি বর্তমান থেকে এম্বেড থাকা সংস্থান ফাইলগুলি পড়ার জন্য খুব সুবিধাজনক মনে করতে পারেন Assembly:

using System.IO;
using System.Linq;
using System.Text;
using static System.IO.Path;
using static System.Reflection.Assembly;

public static class EmbeddedResourceUtils
{
    public static string ReadFromResourceFile(string endingFileName)
    {
        var assembly = GetExecutingAssembly();
        var manifestResourceNames = assembly.GetManifestResourceNames();

        foreach (var resourceName in manifestResourceNames)
        {
            var fileNameFromResourceName = _GetFileNameFromResourceName(resourceName);
            if (!fileNameFromResourceName.EndsWith(endingFileName))
            {
                continue;
            }

            using (var manifestResourceStream = assembly.GetManifestResourceStream(resourceName))
            {
                if (manifestResourceStream == null)
                {
                    continue;
                }

                using (var streamReader = new StreamReader(manifestResourceStream))
                {
                    return streamReader.ReadToEnd();
                }
            }
        }

        return null;
    }

    // https://stackoverflow.com/a/32176198/3764804
    private static string _GetFileNameFromResourceName(string resourceName)
    {
        var stringBuilder = new StringBuilder();
        var escapeDot = false;
        var haveExtension = false;

        for (var resourceNameIndex = resourceName.Length - 1;
            resourceNameIndex >= 0;
            resourceNameIndex--)
        {
            if (resourceName[resourceNameIndex] == '_')
            {
                escapeDot = true;
                continue;
            }

            if (resourceName[resourceNameIndex] == '.')
            {
                if (!escapeDot)
                {
                    if (haveExtension)
                    {
                        stringBuilder.Append('\\');
                        continue;
                    }

                    haveExtension = true;
                }
            }
            else
            {
                escapeDot = false;
            }

            stringBuilder.Append(resourceName[resourceNameIndex]);
        }

        var fileName = GetDirectoryName(stringBuilder.ToString());
        return fileName == null ? null : new string(fileName.Reverse().ToArray());
    }
}

0

সমস্ত লোকের জন্য যারা উইনফর্মগুলিতে কেবল একটি হার্ডকোডযুক্ত ফাইলের পাঠ্য চান;

  1. সমাধান এক্সপ্লোরার> সংস্থানসমূহ> আপনার ফাইল যুক্ত করুন এ আপনার অ্যাপ্লিকেশনটিতে ডান ক্লিক করুন।
  2. এটিতে ক্লিক করুন, এবং বৈশিষ্ট্য ট্যাবে "ফাইল টাইপ" "পাঠ্য" এ সেট করুন।
  3. আপনার প্রোগ্রামে কেবল Resources.<name of resource>.toString();ফাইলটি পড়তে হবে।

আমি এটিকে সর্বোত্তম অনুশীলন বা অন্য কোনও হিসাবে সুপারিশ করব না, তবে এটি দ্রুত কাজ করে এবং যা করার দরকার তা করে।


0

যে ব্যবহারকারীরা ভিবি.নেট ব্যবহার করছেন তাদের জন্য

Imports System.IO
Imports System.Reflection

Dim reader As StreamReader
Dim ass As Assembly = Assembly.GetExecutingAssembly()
Dim sFileName = "MyApplicationName.JavaScript.js" 
Dim reader = New StreamReader(ass.GetManifestResourceStream(sFileName))
Dim sScriptText = reader.ReadToEnd()
reader.Close()

MyApplicationNameআমার আবেদনের নাম স্থান কোথায় । এটি সমাবেশ নাম নয়। এই নামটি প্রকল্পের বৈশিষ্ট্যগুলিতে সংযুক্ত করা হয় (অ্যাপ্লিকেশন ট্যাব)।

আপনি যদি সঠিক উত্সের নাম না পান তবে আপনি GetManifestResourceNames()ফাংশনটি ব্যবহার করতে পারেন

Dim resourceName() As String = ass.GetManifestResourceNames()

অথবা

Dim sName As String 
    = ass.GetManifestResourceNames()
        .Single(Function(x) x.EndsWith("JavaScript.js"))

অথবা

Dim sNameList 
    = ass.GetManifestResourceNames()
        .Where(Function(x As String) x.EndsWith(".js"))

-1

ফর্ম লোড ইভেন্টে এমবেডড টিএক্সটি ফাইল পড়ুন।

পরিবর্তনশীল গতিশীল সেট করুন।

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

ইনক্লুড টেক্সট () এর জন্য শূন্যতা তৈরি করুন, ভিজ্যুয়াল স্টুডিও এটি আপনার জন্য করে। কোডব্লকটি অটো জেনারেট করতে লাইটব্লব ক্লিক করুন।

জেনারেটেড কোড ব্লকের ভিতরে নিম্নলিখিতটি রাখুন

রিসোর্স ঘ

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

}

এটি কী অর্জন করেছিল এটি ছিল একাধিক টেক্সট ফাইল সংযুক্ত করার একটি পদ্ধতি এবং একক সমৃদ্ধ পাঠ্য বাক্সের ভিতরে তাদের এম্বেড করা ডেটা পড়তে। যা কোডের এই নমুনার সাথে আমার কাঙ্ক্ষিত প্রভাব ছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.