So lesen Sie die eingebettete Ressourcentextdatei

Wie lese ich eine eingebettete Ressource (Textdatei) mit StreamReader und StreamReader sie als String zurück? Mein aktuelles Skript verwendet ein Windows-Formular und ein Textfeld, mit dem der Benutzer Text in einer Textdatei suchen und ersetzen kann, die nicht eingebettet ist.

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

Sie können die Assembly.GetManifestResourceStream Methode verwenden :

  1. Fügen Sie die folgenden Verwendungen hinzu

     using System.IO; using System.Reflection; 
  2. Eigenschaft der relevanten Datei festlegen:
    Parameter Build Action mit Wert Embedded Resource

  3. Verwenden Sie den folgenden Code

 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 ist der Name einer der in assembly eingebetteten Ressourcen. Wenn Sie beispielsweise eine Textdatei mit dem Namen "MyFile.txt" , die im Stammverzeichnis eines Projekts mit dem Standardnamespace "MyCompany.MyProduct" , lautet resourceName "MyCompany.MyProduct.MyFile.txt" . Sie können mithilfe der Assembly.GetManifestResourceNames Methode eine Liste aller Ressourcen in einer Assembly.GetManifestResourceNames abrufen .

Sie können eine Datei als Ressource mithilfe von zwei separaten Methoden hinzufügen.

Der C # -Code, der für den Zugriff auf die Datei erforderlich ist, unterscheidet sich je nach der zum Hinzufügen der Datei verwendeten Methode.

Methode 1: Hinzufügen einer vorhandenen Datei, Festlegen der Eigenschaft für die Embedded Resource

Fügen Sie die Datei zu Ihrem Projekt hinzu und legen Sie den Typ dann auf Embedded Resource .

HINWEIS: Wenn Sie die Datei mit dieser Methode hinzufügen, können Sie mit GetManifestResourceStream darauf zugreifen (siehe Antwort von @dtb).

Bildbeschreibung hier eingeben

Methode 2: Datei zu Resources.resx

Öffnen Sie die Resources.resx Datei, verwenden Sie die Dropdown-Box, um die Datei hinzuzufügen, und setzen Sie Access Modifier auf public .

HINWEIS: Wenn Sie die Datei mit dieser Methode hinzufügen, können Sie mit Properties.Resources darauf zugreifen (siehe Antwort von @Night Walker).

Bildbeschreibung hier eingeben

Sehen Sie sich diese Seite an: http://support.microsoft.com/kb/319292

Grundsätzlich verwenden Sie System.Reflection , um einen Verweis auf die aktuelle Assembly zu erhalten. Dann verwenden Sie GetManifestResourceStream() .

Beispiel von der Seite, die ich gepostet habe:

Hinweis : muss using System.Reflection; damit dies funktioniert

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

In Visual Studio können Sie den Zugriff auf eine Dateiressource direkt über die Registerkarte Ressourcen der Projekteigenschaften einbetten (in diesem Beispiel “Analytics”). Visual Studio Screenshot - Registerkarte Ressourcen

Auf die resultierende Datei kann dann als Byte-Array zugegriffen werden

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

Sollten Sie es als Stream benötigen, dann (von https://stackoverflow.com/a/4736185/432976 )

 Stream stream = new MemoryStream(jsonSecrets) 

Wenn Sie die Datei den Ressourcen hinzugefügt haben, sollten Sie ihre Zugriffsmodifizierer als öffentlich markieren, da Sie beispielsweise Folgendes ausführen können.

 byte[] clistAsByteArray = Properties.Resources.CLIST01; 

CLIST01 ist der Name der eingebetteten Datei.

Tatsächlich können Sie zu dem resources.Designer.cs gehen und sehen, wie der Name des Getters ist.

Ich weiß, es ist ein alter Faden, aber das hat bei mir funktioniert:

  1. Fügen Sie die Textdatei den Projektressourcen hinzu
  2. Stellen Sie den Zugriffsmodifizierer öffentlich ein, wie oben von Andrew Hill gezeigt
  3. lies den Text so:

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

Der Text, den ich den Ressourcen hinzugefügt habe: ‘SomeText.txt’

Sie können diese vereinfachte Version der @ dtb-Antwort auch verwenden:

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

Etwas, das ich gerade gelernt habe, ist, dass deine Datei kein “.” (Punkt) im Dateinamen.

EIN

Templates.plainEmailBodyTemplate-de.txt -> functioniert !!!
Templates.plainEmailBodyTemplate.de.txt -> funktioniert nicht über GetManifestResourceStream ()

Wahrscheinlich, weil das Framework über Namespaces vs Dateiname verwirrt wird …

Hinzufügen zB Testfile.sql Projekt Menü -> Eigenschaften -> Ressourcen -> Vorhandene Datei hinzufügen

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

Ich habe eine eingebettete Ressourcentextdatei gelesen:

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

Probe:

 var template = GetLines(Properties.Resources.LasTemplate /* resource name */); template.ForEach(ln => { Debug.WriteLine(ln); }); 

Durch all Ihre Kräfte kombiniere ich diese Hilfsklasse, um Ressourcen aus jeder Assembly und jedem Namespace generisch zu lesen.

 public class ResourceReader { public static IEnumerable FindEmbededResources(Func predicate) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return GetEmbededResourceNames() .Where(predicate) .Select(name => ReadEmbededResource(typeof(TAssembly), name)) .Where(x => !string.IsNullOrEmpty(x)); } public static IEnumerable GetEmbededResourceNames() { var assembly = Assembly.GetAssembly(typeof(TAssembly)); return assembly.GetManifestResourceNames(); } public static string ReadEmbededResource(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(); } } } } 

Ich weiß, das ist alt, aber ich wollte nur auf NETMF (.Net MicroFramework) hinweisen, Sie können dies leicht tun:

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

Da NETMF nicht GetManifestResourceStream

Ich war verärgert, dass Sie immer den Namespace und den Ordner in die Zeichenfolge einschließen mussten. Ich wollte den Zugriff auf die eingebetteten Ressourcen vereinfachen. Deshalb habe ich diese kleine class geschrieben. Fühlen Sie sich frei zu benutzen und zu verbessern!

Verwendung:

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

class:

 public class EmbeddedResources { private static readonly Lazy _callingResources = new Lazy(() => new EmbeddedResources(Assembly.GetCallingAssembly())); private static readonly Lazy _entryResources = new Lazy(() => new EmbeddedResources(Assembly.GetEntryAssembly())); private static readonly Lazy _executingResources = new Lazy(() => 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))); } 

Nach dem Lesen aller hier veröffentlichten Lösungen. So habe ich es getriggers:

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

Lesen Sie die eingebettete TXT-Datei beim Laden des Formulars.

Setzen Sie die Variablen dynamisch.

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

Rufen Sie einen Versuch Catch.

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

Create Void für IncludeText (), Visual Studio Tut dies für Sie. Klicken Sie auf die Glühbirne, um den CodeBlock automatisch zu generieren.

Legen Sie Folgendes in den generierten Codeblock

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

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

Ressource 3

 var assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream(file3)) using (StreamReader reader = new StreamReader(stream)) { string result3 = reader.ReadToEnd(); richTextBox1.AppendText(result3); } 

Wenn Sie die zurückgegebene Variable an anderer Stelle senden möchten, rufen Sie einfach eine andere function an und …

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

Was dies erreicht hat, war dies, eine Methode, mehrere txt-Dateien zu kombinieren und ihre eingebetteten Daten in einer einzigen Rich-Text-Box zu lesen. Das war meine gewünschte Wirkung mit diesem Beispiel von Code.