864 Stimmen

Wie lese ich eine eingebettete Ressource-Textdatei?

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

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

19voto

miciry89 Punkte 162

Hinzufügen von z. B. Testfile.sql Menü Projekt -> Eigenschaften -> Ressourcen -> Vorhandene Datei hinzufügen

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

enter image description here

4 Stimmen

Es wird byte[] zurückgegeben, für Textdateien verwenden Sie ` Encoding.UTF8.GetString(Properties.Resources.Testfile)`

13voto

S_Teo Punkte 121

Ich weiß, es ist ein altes Thema, aber so hat es bei mir funktioniert:

  1. die Textdatei zu den Projektressourcen hinzufügen
  2. den Zugriffsmodifikator auf öffentlich setzen, wie oben von Andrew Hill gezeigt
  3. Lesen Sie den Text wie folgt:

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

Der Text, den ich zu den Ressourcen hinzugefügt habe: 'SomeText.txt'

11voto

Peter Gfader Punkte 7557

Ich habe gerade gelernt, dass Ihre Datei kein "." (Punkt) im Dateinamen haben darf.

A "." in filename is no good.

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

Wahrscheinlich, weil der Rahmen über Namespaces vs. Dateinamen verwirrt wird...

4 Stimmen

Entschuldigung. Das ist falsch. Punkte funktionieren. (Zumindest funktionierte es bei mir, NET4.5) Ich weiß nicht, warum Sie diesen Fehler hatten.

0 Stimmen

Ja, sie funktionieren, aber sie fungieren als Directory-Separator. Templates.plainEmailBodyTemplate.en.txt sucht nach " \Templates\plainEmailBodyTemplate\en.txt "Ressource

0 Stimmen

Nein. Ich habe es versucht. GetManifestResourceStream kann auf eingebettete Ressourcen mit mehr als einem Punkt im Dateinamen zugreifen. (NET4.5)

10voto

Timmerz Punkte 5871

Sie können auch diese vereinfachte Version von @dtb's Antwort 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();
    }
}

0 Stimmen

Sind Sie sich da sicher? Laut diesem Link sieht es so aus.... stackoverflow.com/questions/1065168/

9voto

t3chb0t Punkte 13489

Mit allen Ihren Kräften zusammen verwende ich diese Hilfsklasse, um Ressourcen aus jeder Assembly und jedem Namespace auf generische Weise zu lesen.

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 Stimmen

Plus einen für Captain Planet :P

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X