web-dev-qa-db-fra.com

Comment incorporer un fichier texte dans un assemblage .NET?

Je voudrais incorporer un fichier texte dans une assemblée pour pouvoir 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 le faites-vous et comment chargez-vous par programme le texte dans une chaîne?

112
Adam Haile

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

Dans la fenêtre qui s'ouvre, accédez à 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.

enter image description here

Ensuite, dans la barre d’outils située au-dessus de la page à onglet, sélectionnez pour ajouter un nouveau fichier texte, nommez-le, il sera ajouté à votre projet et ouvert.

Si vous en êtes aussi loin, vous pouvez taper Ressources dans votre code. Le NomYouGaveTheTextFileHere 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 à votre place).

Si quelque chose n'était pas clair au sujet de la description ci-dessus, laissez un commentaire et je le modifierai jusqu'à ce qu'il soit complet ou qu'il ait du sens :)

136

Dans Visual Studio 2003, Visual Studio 2005 et éventuellement des 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 "Ressources incorporées". Ensuite, vous pouvez accéder au fichier sous forme de flux à l'aide de Assembly.GetManifestResourceStream(string).

Les autres réponses ici sont plus pratiques. J'inclus ceci pour être complet.

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

36
Drew Noakes

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

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

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 sous le nom de ressource.

4
Otávio Décio

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

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 Explorer, puis j'ai cliqué avec le bouton droit sur le dossier Properties, choisi Add Existing Item et choisi le fichier. (Dites, FileName.txt.) Puis, tout en restant dans le Solution Explorer, cliquez avec le bouton droit sur le fichier inclus, sélectionnez Properties et choisissez Build Action comme Embedded Resource.

Puis 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 ne pas devez ajouter ce fichier en tant que ressource, comme cela était proposé dans réponse acceptée .

1
c00000fd

Voici ce que j'ai fait:

  1. Ajout de mes fichiers (ressources) dans Visual Studio en cliquant avec le bouton droit de la souris sur le projet.
  2. Faites un clic droit sur chaque fichier que vous avez ajouté et changez le "Type de construction" en Ressource incorporé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, je l'ai donc lu dans un flux à l'aide de GetManifestResourceStream(fileName). La façon dont j'ai accédé aux noms de fichiers est en appelant GetManifestResourceNames()

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

1
Pavan

Ajouter à la réponse de Pavan, pour obtenir l’Assemblée actuelle (dans la section générale):

Assembly _Assembly;

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

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