774 votes

Comment lire le fichier texte des ressources intégrées

Comment lire une ressource incorporée (fichier texte) à l'aide de StreamReader et le retourner sous forme de chaîne de caractères ? Mon script actuel utilise un formulaire Windows et une zone de texte qui permet à l'utilisateur de trouver et de remplacer du texte dans un fichier texte qui n'est pas intégré.

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

1332voto

dtb Points 104373

Vous pouvez utiliser le Assembly.GetManifestResourceStream Méthode :

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


Il n'y a rien de plus astucieux que d'obtenir le resourceName à partir du nom du fichier seulement (en passant le truc de l'espace de nom) :

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

Un exemple complet :

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 votes

Super, merci mec. J'avais une deuxième question concernant le chemin d'enregistrement, comment puis-je le spécifier pour qu'il soit enregistré sur le bureau d'un ordinateur qui aurait peut-être une structure de répertoire différente ?

5 votes

@Me.Close : Jetez un coup d'oeil à Environment.SpecialFolder pour obtenir le dossier du bureau. Vous devez garder à l'esprit que la ressource sera nommée en fonction de son chemin d'accès dans le projet, de sorte que son nom ne peut pas être juste file1.txt .

16 votes

L'argument en faveur de GetManifestResourceStream a besoin du chemin comme l'indique @adrian. Si cela peut aider quelqu'un, ce chemin est comme ce que @SimpleCoder montre dans l'exemple : MyNamespace.Filename.Ext . J'avais déjà essayé MyNamespace.Resources.Filename.Ext mais cela donne un résultat nul.

93voto

Chris Laplante Points 18060

En gros, 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ée :

Note Il faut ajouter using System.Reflection; pour que cela fonctionne

   Assembly _assembly;
   StreamReader _textStreamReader;

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

37 votes

+1 Pour avoir inclus le namespace comme partie du nom de la ressource

45 votes

var auxList= System.Reflection.Assembly.GetExecutingAssembly().GetManifes‌​tResourceNames(); Cette méthode peut être très utile lorsque vous souhaitez connaître le nom exact de la ressource. (Tiré de la question stackoverflow.com/questions/27757/ )

75voto

Andrew Hill Points 473

Dans Visual Studio, vous pouvez intégrer directement 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 alors être accédé comme un tableau d'octets par

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

Si vous en avez besoin en tant que flux, alors ( from https://stackoverflow.com/a/4736185/432976 )

Stream stream = new MemoryStream(jsonSecrets)

13 votes

Vous pouvez également utiliser cette méthode avec un fichier texte, auquel cas vous auriez : string jsonSecrets = YourNameSpace.Properties.Resources.YourFileName ;

36voto

Night Walker Points 4598

Lorsque vous avez ajouté le fichier aux ressources, vous devez sélectionner ses Modificateurs d'accès comme publics pour pouvoir faire quelque chose comme ceci.

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 est le nom du fichier incorporé.

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

5 votes

Pourriez-vous nous en dire plus ? Lorsque je clique avec le bouton droit de la souris sur un fichier dans l'explorateur de solutions et que je définis les propriétés de ce fichier, j'ai l'impression que c'est le cas. Action a Incorporated ressource Je n'en ai pas. Access Modifiers dans le panneau des propriétés. De plus, je n'ai pas de Propersites.Resources j'obtiens un The name 'Properties' does not exist in the current context erreur lors de la compilation de votre code.

2 votes

Cela ne fonctionnera que si vous intégrez le fichier dans le fichier Resources.resx Voir ma réponse sur les différentes méthodes pour intégrer des fichiers dans un projet.

0 votes

Où sont définies les propriétés ?

12voto

S_Teo Points 11

Je sais que c'est un vieux sujet, 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 à 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'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X