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

1538voto

dtb Punkte 205441

Sie können die Assembly.GetManifestResourceStream Methode :

  1. Fügen Sie die folgenden Verwendungen hinzu

    using System.IO;
    using System.Reflection;
  2. Eigenschaft der betreffenden 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 Ressourcen, die in assembly . Wenn Sie zum Beispiel eine Textdatei mit dem Namen "MyFile.txt" die in der Wurzel eines Projekts mit Standard-Namensraum platziert wird "MyCompany.MyProduct" entonces resourceName es "MyCompany.MyProduct.MyFile.txt" . Sie können eine Liste aller Ressourcen in einer Baugruppe erhalten, indem Sie die Assembly.GetManifestResourceNames Methode .


Ein schlaues Köpfchen, das die resourceName nur anhand des Dateinamens (durch Übergehen des Namensraums):

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

Ein vollständiges Beispiel:

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

1 Stimmen

Toll, danke, Mann. Ich hatte noch eine zweite Frage zum Speicherpfad. Wie würde ich ihn angeben, damit er auf jedem Computer, der vielleicht eine andere Verzeichnisstruktur hat, auf dem Desktop gespeichert wird?

5 Stimmen

@Me.Close: Werfen Sie einen Blick auf Environment.SpecialFolder um den Desktop-Ordner zu erhalten. Sie müssen bedenken, dass die Ressource auf der Grundlage ihres Pfades innerhalb des Projekts benannt wird, so dass ihr Name nicht einfach file1.txt .

17 Stimmen

Das Argument für GetManifestResourceStream braucht den von @adrian angegebenen Pfad. Falls es jemandem hilft, der Pfad ist wie das, was @SimpleCoder im Beispiel zeigt: MyNamespace.Filename.Ext . Ich hatte zuvor versucht MyNamespace.Resources.Filename.Ext aber das führt zu einer Null.

194voto

Contango Punkte 70203

Sie können eine Datei mit zwei verschiedenen Methoden als Ressource hinzufügen.

Der für den Zugriff auf die Datei erforderliche C#-Code ist anders je nach der Methode, mit der die Datei ursprünglich hinzugefügt wurde.

Methode 1: Vorhandene Datei hinzufügen, Eigenschaft setzen auf Embedded Resource

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

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

enter image description here

Methode 2: Datei hinzufügen zu Resources.resx

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

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

enter image description here

10 Stimmen

Eine dritte Methode besteht darin, die Datei zum Projekt hinzuzufügen und dann "In das Ausgabeverzeichnis kopieren" auf "Wahr" zu setzen. Beim Kompilieren wird die Datei in das Ausgabeverzeichnis kopiert, und Sie können die Datei mit normalen Mitteln lesen. Beispiel: in einer WPF-Anwendung, wenn Sie ein Bild anzeigen möchten.

1 Stimmen

Daher die Einstellung der Build-Aktion auf Resource tut nichts, was es Ihnen erlaubt, das Element als Ressource auszulesen? Sie müssen EmbeddedResource oder zu einer Resources.resx Datei?

3 Stimmen

@Maslow Wenn Sie die Build-Aktion auf "Ressource" setzen, wird eine verknüpfte Ressource erstellt, während Sie die Build-Aktion auf "Eingebettete Ressource" setzen und die Ressource in die Ausgabe-Assembly kompilieren. Der Begriff "verknüpfte Ressource" ist ein schicker Ausdruck für "Kopieren der Datei in das Ausgabeverzeichnis beim Kompilieren" (Sie können die Datei dann zur Laufzeit mit jeder normalen Methode lesen). Weitere Informationen über den Unterschied zwischen diesen beiden Typen finden Sie unter Hinzufügen und Bearbeiten von Ressourcen (Visual C#) unter msdn.microsoft.com/de-us/library/7k989cfy(v=vs.90).aspx .

98voto

Chris Laplante Punkte 28784

Im Grunde genommen verwenden Sie System.Reflection um einen Verweis auf die aktuelle Baugruppe zu erhalten. Dann verwenden Sie GetManifestResourceStream() .

Beispiel, von der Seite, die ich gepostet habe:

Hinweis : hinzufügen müssen 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!");
   }

38 Stimmen

+1 Für die Aufnahme der namespace als Teil des Ressourcennamens

48 Stimmen

var auxList= System.Reflection.Assembly.GetExecutingAssembly().GetManifes‌​tResourceNames(); Diese Methode kann sehr nützlich sein, wenn Sie den genauen Namen der Ressource erfahren möchten. (Entnommen aus der Frage stackoverflow.com/questions/27757/ )

84voto

Andrew Hill Punkte 1852

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 screen shot - Resources tab

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

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)

14 Stimmen

Sie können dies auch mit einer Textdatei verwenden. In diesem Fall würden Sie Folgendes eingeben: string jsonSecrets = YourNameSpace.Properties.Resources.YourFileName;

42voto

Night Walker Punkte 19672

Wenn Sie die Datei zu den Ressourcen hinzugefügt haben, sollten Sie ihre Zugriffsmodifikatoren als öffentlich markieren, dann können Sie etwas wie das Folgende machen.

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 ist der Name der eingebetteten Datei.

Eigentlich können Sie auf die resources.Designer.cs gehen und sehen, was ist der Name der Getter.

5 Stimmen

Könnten Sie dies bitte näher erläutern? Wenn ich im Projektmappen-Explorer mit der rechten Maustaste auf eine Datei klicke->Eigenschaften, und dann Action a Incorporated ressource Ich habe keine. Access Modifiers im Eigenschaftsfenster. Außerdem habe ich keine Propersites.Resources Klasse, erhalte ich eine The name 'Properties' does not exist in the current context Fehler beim Kompilieren Ihres Codes.

2 Stimmen

Dies funktioniert nur, wenn Sie die Datei in Resources.resx siehe meine Antwort zu den verschiedenen Methoden zum Einbetten von Dateien in ein Projekt.

0 Stimmen

Wo sind die Eigenschaften definiert?

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