125 votes

Comment intégrer un fichier texte dans un assemblage .NET ?

J'aimerais intégrer un fichier texte dans un assemblage afin de pouvoir charger le texte sans avoir à le lire depuis le disque, et afin que tout ce dont j'ai besoin soit contenu dans l'exe. (Pour qu'il soit plus portable)

Existe-t-il un moyen de faire cela ? Je suppose que cela concerne les fichiers de ressources ?

Et si vous le pouvez, comment faites-vous et comment programmez-vous le texte dans une chaîne de caractères ?

155voto

Lasse V. Karlsen Points 148037

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

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

enter image description here

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

Si vous êtes arrivé jusqu'ici, alors 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 dans la description ci-dessus, veuillez laisser un commentaire et je la modifierai jusqu'à ce qu'elle soit complète ou ait un sens :)

1 votes

À quoi ressemblerait le code de la directive "using" ? J'ai du mal à le faire fonctionner. J'ai ajouté le fichier solutions.txt en tant que ressource, mais il ne trouve pas Resources.solutions - je pense qu'il me manque la directive using.

3 votes

Ah-hah, tout ce que j'avais à faire était d'ajouter un My. au début (i.e. My.Resources.solutions) Simples !

2 votes

L'ajout d'une ressource génère et inclut Properties\Resources.Designer.cs avec namespace YourProjectRootNamespace.Properties vous devez donc utiliser YourProjectRootNamespace.Properties . ProjectRootNamespace est défini dans les propriétés de votre projet dans VisualStudio.

40voto

Drew Noakes Points 69288

Dans Visual Studio 2003, Visual Studio 2005 et peut-être des versions antérieures (cela fonctionne aussi en 2008), vous pouvez inclure le fichier texte dans votre projet, puis, dans le panneau "Propriétés", définir 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. Je l'inclus pour être complet.

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

9 votes

Remarque : Utilisez l'espace de noms + le nom du fichier comme paramètre pour GetManifestResourceStream(), par exemple "MyNamespace.MyTextfile.txt". Vous pouvez également appeler GetManifestResourceNames() pour obtenir une liste de tous les noms.

33voto

Narottam Points 159

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

global::packageName.Properties.Resources.ThatFileName

3 votes

Il s'agit d'une bien meilleure approche, car elle déclenchera une erreur de compilation si la ressource est supprimée. Elle élimine également les erreurs de frappe. Merci pour ce message.

0 votes

+5. Puis-je le réécrire dans le fichier au niveau de la DLL C# ?

2 votes

Et si je veux spécifier ThatFileName à partir d'une variable ?

5voto

c00000fd Points 2525

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

Avant toute chose, incluez votre fichier dans votre solution dans Visual Studio. (Dans mon cas VS 2017 Community.) Je suis passé à l'option Solution Explorer puis un clic droit Properties dossier, choisissez Add Existing Item et a choisi le dossier. (Dites, FileName.txt .) Ensuite, alors que vous êtes toujours dans la Solution Explorer cliquez avec le bouton droit de la souris sur le fichier inclus, sélectionnez Properties et choisir Build Action comme Embedded Resource .

Utilisez ensuite 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 besoin d'ajouter ce fichier comme une ressource comme cela a été proposé dans le réponse acceptée .

4voto

Otávio Décio Points 44200

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 en tant que Resource.WhateverStringYouDefined.

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