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

6voto

dreamwork801 Punkte 113

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

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

Desde NETMF hat keine GetManifestResourceStream

5voto

Einige VS .NET Projekttypen generieren nicht automatisch eine .NET (.resx) Datei. Mit den folgenden Schritten fügen Sie eine Ressourcendatei zu Ihrem Projekt hinzu:

  1. Klicken Sie mit der rechten Maustaste auf den Projektknoten und wählen Sie Hinzufügen/Neues Element, blättern Sie zu Ressourcendatei. Wählen Sie im Feld Name einen geeigneten Namen, z. B. Ressourcen, und klicken Sie auf die Schaltfläche Hinzufügen.
  2. Die Ressourcendatei Resources.resx wird dem Projekt hinzugefügt und ist als Knoten im Projektmappen-Explorer zu sehen.
  3. Eigentlich werden zwei Dateien erstellt, außerdem gibt es eine automatisch generierte C#-Klasse Resources.Designer.cs. Bearbeiten Sie diese nicht, sie wird von VS verwaltet. Die Datei enthält eine Klasse namens Resources .

Jetzt können Sie eine Textdatei als Ressource hinzufügen, z. B. eine xml-Datei:

  1. Doppelklicken Sie auf Resources.resx. Wählen Sie Ressource hinzufügen > Vorhandene Datei hinzufügen und blättern Sie zu der Datei, die Sie einbeziehen möchten. Belassen Sie den Standardwert Internal für Access Modify.
  2. Ein Symbol stellt die neue Ressource dar. Wenn es ausgewählt ist, zeigt das Eigenschaftsfenster seine Eigenschaften an. Für xml-Dateien wählen Sie unter der Eigenschaft Kodierung Unicode (UTF-8) - Codepage 65001 anstelle der standardmäßigen lokalen Codepage. Für andere Textdateien wählen Sie die korrekte Kodierung dieser Datei, z. B. Codepage 1252.
  3. Für Textdateien wie xml-Dateien wird die Klasse Resources hat eine Eigenschaft vom Typ string die nach der eingeschlossenen Datei benannt ist. Wenn der Dateiname z.B. RibbonManifest.xml lautet, dann sollte die Eigenschaft den Namen RibbonManifest . Den genauen Namen finden Sie in der Codedatei Resources.Designer.cs.
  4. Verwenden Sie die String-Eigenschaft wie jede andere String-Eigenschaft, zum Beispiel: string xml = Resources.RibbonManifest . Die allgemeine Form lautet ResourceFileName.IncludedTextFileName . Verwenden Sie nicht ResourceManager.GetString da die get-Funktion der String-Eigenschaft dies bereits getan hat.

0 Stimmen

Ich danke Ihnen! Das war die einzige Antwort, die mir geholfen hat und deren Schritte für mich verständlich waren. Meine App hatte keine Ressourcendatei und ich musste eine erstellen. Das Einzige war, dass es bei Schritt 1 für mich keine Schaltfläche Hinzufügen gab, ich musste stattdessen auf Speichern klicken.

4voto

Sith2021 Punkte 2514

Ich lese eine eingebettete Ressource Textdatei verwenden:

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

Beispiel:

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

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

4voto

BullyWiiPlaza Punkte 14399

Dies ist eine Klasse, die sehr praktisch ist, um eingebettete Ressourcendateien aus der aktuellen Assembly :

using System.IO;
using System.Linq;
using System.Text;
using System.Reflection;

public static class EmbeddedResourceUtils
{
    public static string ReadFromResourceFile(string endingFileName)
    {
        var assembly = 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 = Path.GetDirectoryName(stringBuilder.ToString());
        return fileName == null ? null : new string(fileName.Reverse().ToArray());
    }
}

0 Stimmen

@Krythic: Es ist offensichtlich, wenn Sie die ganze Klasse in Ihren Quellcode kopieren. Ihre IDE wird dann alles automatisch auflösen. Ich habe die using-Anweisungen bereits eingefügt, damit die Informationen nicht in der Antwort fehlen.

0 Stimmen

@Krythic: Es ist jetzt bearbeitet, um die statischen Verwendungen zu entfernen

0 Stimmen

Vielen Dank dafür, nur eine höfliche Anmerkung: Es fehlt ein using System.Reflection; :D

4voto

Bimo Punkte 5077

Nachdem ich alle hier veröffentlichten Lösungen gelesen habe. So habe ich es gelöst:

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

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