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?
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.
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 :)
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.
Après avoir incorporé un fichier texte, utilisez-le n'importe où dans le code comme ceci ...
global::packageName.Properties.Resources.ThatFileName
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.
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 .
Voici ce que j'ai fait:
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.
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!");
}