Question Comment lire le fichier texte de ressources incorporées


Comment lire une ressource incorporée (fichier texte) en utilisant StreamReader et le renvoyer comme une chaîne? Mon script actuel utilise un formulaire Windows et une zone de texte qui permet à l'utilisateur de rechercher et de remplacer du texte dans un fichier texte qui n'est pas incorporé.

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

527
2017-07-22 22:51


origine


Réponses:


Vous pouvez utiliser le Assembly.GetManifestResourceStream Méthode:

  1. Ajouter les utilisations suivantes

    using System.IO;
    using System.Reflection;
    
  2. Définir la propriété du fichier concerné:
    Paramètre Build Action avec valeur Embedded Resource

  3. Utilisez le code suivant

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 est le nom de l'une des ressources intégrées dans assembly. Par exemple, si vous incorporez un fichier texte nommé "MyFile.txt" qui est placé dans la racine d'un projet avec un espace de noms par défaut "MyCompany.MyProduct", puis resourceName est "MyCompany.MyProduct.MyFile.txt". Vous pouvez obtenir une liste de toutes les ressources d'un assemblage en utilisant Assembly.GetManifestResourceNames Méthode.


906
2017-07-22 23:03



Vous pouvez ajouter un fichier en tant que ressource en utilisant deux méthodes distinctes.

Le code C # requis pour accéder au fichier est différent, en fonction de la méthode utilisée pour ajouter le fichier en premier lieu.

Méthode 1: Ajouter un fichier existant, définir la propriété à Embedded Resource

Ajoutez le fichier à votre projet, puis définissez le type sur Embedded Resource.

Remarque: Si vous ajoutez le fichier en utilisant cette méthode, vous pouvez utiliser GetManifestResourceStream pour y accéder (voir la réponse de @dtb).

enter image description here

Méthode 2: Ajouter un fichier à Resources.resx

Ouvrez le Resources.resx fichier, utilisez la liste déroulante pour ajouter le fichier, Access Modifier à public.

Remarque: Si vous ajoutez le fichier en utilisant cette méthode, vous pouvez utiliser Properties.Resources pour y accéder (voir la réponse de @Night Walker).

enter image description here


104
2017-10-27 10:00



Jetez un oeil à cette page: http://support.microsoft.com/kb/319292

Fondamentalement, vous utilisez System.Reflection pour obtenir une référence à l'Assemblée actuelle. Ensuite, vous utilisez GetManifestResourceStream().

Exemple, à partir de la page que j'ai posté:

Remarque: besoin d'ajouter using System.Reflection; pour que ça marche

   Assembly _assembly;
   StreamReader _textStreamReader;

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

83
2017-07-22 23:01



Dans Visual Studio, vous pouvez directement intégrer l'accès à une ressource de fichier via l'onglet Ressources des propriétés du projet ("Analytics" dans cet exemple). visual studio screen shot - Resources tab

Le fichier résultant peut ensuite être accédé en tant que tableau d'octets par

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

Si vous en avez besoin comme flux, alors https://stackoverflow.com/a/4736185/432976 )

Stream stream = new MemoryStream(jsonSecrets)

65
2017-10-24 01:26



Lorsque vous avez ajouté le fichier aux ressources, vous devez sélectionner ses modificateurs d'accès en tant que public que vous pouvez faire quelque chose comme suit.

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 est le nom du fichier incorporé.

En fait vous pouvez aller à resources.Designer.cs et voir quel est le nom du getter.


25
2018-04-20 16:34



Je sais que c'est un vieux fil, mais c'est ce qui a fonctionné pour moi:

  1. ajouter le fichier texte aux ressources du projet
  2. définir le modificateur d'accès au public, comme indiqué ci-dessus par Andrew Hill
  3. lisez le texte comme ceci:

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

Le texte que j'ai ajouté aux ressources: 'SomeText.txt'


12
2017-12-30 14:08



Vous pouvez également utiliser cette version simplifiée de la réponse de @ dtb:

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

7
2017-07-08 19:14



Quelque chose que j'ai appris tout à l'heure est que votre fichier n'est pas autorisé à avoir un "." (point) dans le nom de fichier.

A "." in filename is no good.

Templates.plainEmailBodyTemplate-fr.txt -> Fonctionne !!!
Templates.plainEmailBodyTemplate.fr.txt -> ne fonctionne pas via GetManifestResourceStream ()

Probablement parce que le cadre est confus sur les espaces de noms vs nom de fichier ...


6
2017-07-03 17:28