it-swarm.com.de

Wie kann man eine Textdatei in eine .NET-Assembly einbetten?

Ich möchte eine Textdatei in eine Assembly einbetten, damit ich den Text laden kann, ohne ihn von der Festplatte lesen zu müssen, und so dass alles, was ich brauche, im Exe enthalten ist. (Damit es tragbarer ist)

Gibt es eine Möglichkeit, dies zu tun? Nehme ich etwas mit den Ressourcendateien an?

Und wenn du kannst, wie machst du das und wie lädst du den Text programmatisch in einen String?

112
Adam Haile

Klicken Sie mit der rechten Maustaste auf die Projektdatei, und wählen Sie Eigenschaften aus.

Wechseln Sie in dem sich öffnenden Fenster zur Registerkarte Ressourcen. Wenn sich in der Mitte der Registerseite nur ein blauer Link befindet, klicken Sie darauf, um eine neue Ressource zu erstellen.

enter image description here

Wählen Sie dann in der Symbolleiste über der Registerseite aus, um eine neue Textdatei hinzuzufügen, geben Sie ihr einen Namen, diese wird Ihrem Projekt hinzugefügt und geöffnet.

Wenn Sie so weit kommen, können Sie in Ihrem Code Resources.TheNameYouGaveTheTextFileHere eingeben und auf dessen Inhalt zugreifen. Wenn Sie die Ressourcenklasse zum ersten Mal in einer Klasse verwenden, müssen Sie eine using-Direktive hinzufügen (drücken Sie nach dem Eingeben von Resources STRG +.

Wenn etwas zu der obigen Beschreibung unklar war, hinterlassen Sie bitte einen Kommentar und ich werde ihn bearbeiten, bis er vollständig ist oder Sinn ergibt :)

In Visual Studio 2003, Visual Studio 2005 und möglicherweise früheren Versionen (dies funktioniert auch in 2008) können Sie die Textdatei in Ihr Projekt aufnehmen. Setzen Sie dann im Bereich "Eigenschaften" die Aktion auf "Eingebettete Ressource". Dann können Sie mit Assembly.GetManifestResourceStream(string) auf die Datei als Stream zugreifen.

Andere Antworten hier sind bequemer. Ich füge dies der Vollständigkeit halber bei.

Beachten Sie, dass dieser Ansatz zum Einbetten anderer Dateitypen wie Bilder, Symbole, Sounds usw. geeignet ist.

36
Drew Noakes

Verwenden Sie nach dem Einbetten einer Textdatei diese Datei an beliebiger Stelle im Code wie folgt ...

global::packageName.Properties.Resources.ThatFileName
29
Narottam Goyal

Ja, Sie haben Recht - erstellen Sie eine Ressourcendatei. Wenn Sie die Zeichenfolge nicht "laden" müssen, wird sie als Ressource referenziert.

4
Otávio Décio

Hier ist was für mich gearbeitet hat. (Ich musste den Inhalt einer Datei lesen, die in eine ausführbare .NET-Image-Datei eingebettet ist.)

Bevor Sie etwas tun, fügen Sie Ihre Datei in Visual Studio Ihrer Lösung hinzu. (In meinem Fall VS 2017 Community.) Ich habe zum Ordner Solution Explorer gewechselt, dann mit der rechten Maustaste auf Properties geklickt, Add Existing Item gewählt und die Datei ausgewählt. (Sagen Sie FileName.txt.) Klicken Sie dann mit der rechten Maustaste auf die enthaltene Datei, wählen Sie Properties aus, und wählen Sie Solution Explorer als Build Action aus, während Sie sich noch im Embedded Resource befinden.

Dann verwenden Sie diesen Code, um die Bytes zu lesen:

string strResourceName = "FileName.txt";

Assembly asm = Assembly.GetExecutingAssembly();
using( Stream rsrcStream = asm.GetManifestResourceStream(asm.GetName().Name + ".Properties." + strResourceName))
{
    using (StreamReader sRdr = new StreamReader(rsrcStream))
    {
        //For instance, gets it as text
        string strTxt = sRdr.ReadToEnd();
    }
}

Beachten Sie, dass Sie in diesem Fall diese Datei nicht als Ressource hinzufügen müssen, wie dies in der akzeptierten Antwort vorgeschlagen wurde.

1
c00000fd

Folgendes habe ich getan:

  1. Meine Dateien (Ressourcen) in Visual Studio hinzugefügt, indem Sie mit der rechten Maustaste auf das Projekt klicken.
  2. Klicken Sie mit der rechten Maustaste auf jede hinzugefügte Datei, und ändern Sie den "Build-Typ" in "Eingebettete Ressource".
  3. Um auf die Ressource zuzugreifen:

    ein. Erhalte die aktuelle Assembly mit der Funktion: GetExecutingAssembly()

    b. Die Ressource, die ich hinzugefügt habe, war eine Textdatei, also lese ich sie mit GetManifestResourceStream(fileName) in einen Stream. Ich habe auf die Dateinamen zugegriffen, indem Sie GetManifestResourceNames() aufrufen.

    c. Verwenden Sie nun eine StreamReader()-Klasse, um das Ende der Datei in eine Variable zu lesen, wenn Sie dies möchten.

1
Pavan

Zur Antwort von Pavan hinzufügen, , um die aktuelle Assembly (allgemeiner Abschnitt) zu erhalten:

Assembly _Assembly;

GetManifestResourceStream (Dateiname) (im Code, wo das Lesen der Ressource erforderlich ist):

try
{
    _Assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_Assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
0
Narjis Hasan