Comment incorporer un fichier texte dans un assemblage .NET?

118

Je voudrais incorporer un fichier texte dans un assemblage afin que je puisse charger le texte sans avoir à le lire à partir du disque, et pour que tout ce dont j'ai besoin soit contenu dans l'exe. (Pour que ce soit plus portable)

Y a-t-il un moyen de faire cela? Je suppose quelque chose avec les fichiers de ressources?

Et si vous le pouvez, comment procédez-vous et comment chargez-vous par programme le texte dans une chaîne?

Adam Haile
la source

Réponses:

147

Cliquez avec le bouton droit sur le fichier projet, sélectionnez Propriétés.

Dans la fenêtre qui s'ouvre, allez dans l'onglet Ressources, et s'il ne contient qu'un lien bleu au milieu de la page à onglet, cliquez dessus pour créer une nouvelle ressource.

entrez la description de l'image ici

Ensuite, dans la barre d'outils au-dessus de la page à onglets, sélectionnez pour ajouter un nouveau fichier texte, donnez-lui un nom, il sera ajouté à votre projet et ouvert.

Si vous arrivez jusque-là, dans votre code, vous pouvez taper Resources.TheNameYouGaveTheTextFileHere et vous pouvez accéder à son contenu. Notez que la première fois que vous utilisez la classe Resources dans une classe, vous devez ajouter une directive using (appuyez sur Ctrl +. Après avoir tapé Resources pour obtenir le menu permettant à VS de le faire pour vous).

Si quelque chose n'était pas clair à propos de la description ci-dessus, veuillez laisser un commentaire et je le modifierai jusqu'à ce qu'il soit complet ou logique :)

Lasse V. Karlsen
la source
1
À quoi ressemblerait le code de directive «using», j'ai du mal à le faire fonctionner. J'ai ajouté le solutions.txt en tant que ressource, mais il ne trouve pas Resources.solutions - je sens que je manque la directive using.
Spedge
3
Ah-hah, tout ce que j'avais à faire était d'ajouter un My. à l'avant (c'est-à-dire My.Resources.solutions) Simples!
Spedge
2
L'ajout d'une ressource génère et inclut Properties\Resources.Designer.csavec namespace YourProjectRootNamespace.Properties, vous devez donc utiliser YourProjectRootNamespace.Properties. ProjectRootNamespaceest défini dans les propriétés de votre projet dans VisualStudio.
ilyaigpetrov
1
Si j'ajoute un fichier texte de cette manière et que je dis que ce fichier texte fait partie de ma solution ... si ce fichier est mis à jour et que je reconstruis l'assembly, la ressource incorporée sera-t-elle également mise à jour? Ou aurai-je besoin de supprimer / rajouter manuellement le fichier si je le modifie un jour?
Peter Tirrell
3
Les fichiers sont regroupés dans des ressources au moment de la compilation, pas lorsque vous les ajoutez. Vous pouvez librement modifier le fichier dans n'importe quel outil de votre choix et le reconstruire, les modifications feront partie de votre assemblage.
Lasse V. Karlsen
38

Dans Visual Studio 2003, Visual Studio 2005 et éventuellement les versions antérieures (cela fonctionne également en 2008), vous pouvez inclure le fichier texte dans votre projet, puis dans le panneau «Propriétés», définissez l'action sur «Ressource intégrée». Ensuite, vous pouvez accéder au fichier en tant que flux en utilisant Assembly.GetManifestResourceStream(string).

D'autres réponses ici sont plus pratiques. J'inclus ceci par souci d'exhaustivité.

Notez que cette approche fonctionnera pour intégrer d'autres types de fichiers tels que des images, des icônes, des sons, etc.

Drew Noakes
la source
8
Remarque: utilisez l'espace de noms + nom de fichier comme paramètre pour GetManifestResourceStream (), par exemple "MyNamespace.MyTextfile.txt". Vous pouvez également appeler GetManifestResourceNames () pour obtenir une liste de tous les noms.
Stiefel
32

Après avoir incorporé un fichier texte, utilisez ce fichier n'importe où dans un code comme celui-ci ...

global::packageName.Properties.Resources.ThatFileName
Narottam Goyal
la source
3
C'est une bien meilleure approche car elle lèvera une erreur de compilation si la ressource est supprimée. Il élimine également les fautes de frappe. Merci pour le post.
Ben Gripka
+5. Puis-je l'écrire dans le fichier dans le niveau DLL C #?
Prajwal Bhat
1
Et si je souhaite spécifier à ThatFileNamepartir d'une variable?
c00000fd
4

Oui, vous avez raison - créez un fichier de ressources. Lorsque vous faites cela, vous n'avez pas besoin de "charger" la chaîne, elle sera référencée comme Resource.WhateverStringYouDefined.

Otávio Décio
la source
2

Voici ce qui a fonctionné pour moi. (J'avais besoin de lire le contenu d'un fichier intégré dans un fichier image exécutable .NET.)

Avant de faire quoi que ce soit, incluez votre fichier dans votre solution dans Visual Studio. (Dans mon cas VS 2017 Community.) Je suis passé au dossier, Solution Explorerpuis j'ai cliqué avec Propertiesle bouton droit de la souris , j'ai choisi Add Existing Itemet choisi le fichier. (Dites,. FileName.txt) Ensuite, tout en restant dans le Solution Explorer, cliquez avec le bouton droit sur le fichier inclus, sélectionnez Propertieset choisissez Build Actioncomme Embedded Resource.

Ensuite, utilisez ce code pour lire ses octets:

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

Notez que dans ce cas, vous n'avez pas besoin d'ajouter ce fichier en tant que ressource comme cela a été proposé dans la réponse acceptée .

c00000fd
la source
1

Voici ce que j'ai fait:

  1. Ajout de mes fichiers (ressources) dans Visual Studio en cliquant avec le bouton droit sur le projet.
  2. Faites un clic droit sur chaque fichier que vous avez ajouté et changez le "Type de construction" en Ressource intégrée.
  3. Pour accéder à la ressource:

    une. Vous avez l'assembly actuel en utilisant la fonction:GetExecutingAssembly()

    b. La ressource que j'ai ajoutée était un fichier texte, donc je l'ai lu dans un flux en utilisant GetManifestResourceStream(fileName). La façon dont j'ai accédé aux noms de fichiers est d'appelerGetManifestResourceNames()

    c. Maintenant, utilisez une StreamReader()classe pour lire jusqu'à la fin du fichier dans une variable si c'est ce que vous voulez.

Pavan
la source
0

Ajout à la réponse de Pavan, pour obtenir l'assemblage actuel (dans la section générale):

Assembly _assembly;

GetManifestResourceStream (fileName) (dans le code, où la ressource de lecture est requise):

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