Comment incorporer un fichier texte dans un assemblage .NET?
-
10-07-2019 - |
Question
Je voudrais incorporer un fichier texte dans un assemblage 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 at-il un moyen de faire cela? J'assume 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?
La solution
Cliquez avec le bouton droit sur le fichier du 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, 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 à ce stade, vous pouvez taper Ressources.TheNameYouGaveTheTextFileHere dans votre code et 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’est pas clair concernant la description ci-dessus, veuillez laisser un commentaire et je le modifierai jusqu’à ce qu’elle soit complète ou ait un sens:)
Autres conseils
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". Vous pouvez ensuite 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 ce fichier n'importe où dans un code comme celui-ci ...
global::packageName.Properties.Resources.ThatFileName
Oui, vous avez raison. Créez un fichier de ressources. Lorsque vous le faites, vous n'avez pas besoin de & charger; Charger " la chaîne, elle sera référencée comme Resource.WitelyStringYouDefined.
Voici ce que j'ai fait:
- Ajout de mes fichiers (ressources) dans Visual Studio en cliquant avec le bouton droit de la souris sur le projet.
- Cliquez avec le bouton droit sur chaque fichier que vous avez ajouté et modifiez le "Type de construction". aux ressources incorporées.
-
Pour accéder à la ressource:
a. Vous avez l'assembly actuel à l'aide de la fonction:
GetExecutingAssembly ()
b. La ressource que j'ai ajoutée était un fichier texte. Je l'ai donc lue dans un flux à l'aide de
GetManifestResourceStream (nomFichier)
. J'ai accédé aux noms de fichiers en appelantGetManifestResourceNames ()
c. Utilisez maintenant une classe
StreamReader ()
pour lire la fin du fichier dans une variable si c'est ce que vous voulez.
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é à Explorateur de solutions
, puis j'ai cliqué avec le bouton droit de la souris sur le dossier Propriétés
, choisi Ajouter un élément existant
et choisi. le fichier. (Dites, NomFichier.txt
.) Puis, toujours dans Explorateur de solutions
, cliquez avec le bouton droit sur le fichier inclus, sélectionnez Propriétés
, puis sélectionnez Action de construction
en tant que Ressource incorporée
.
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 n'avez pas l'ajout de ce fichier en tant que ressource, comme cela a été proposé dans réponse acceptée .
Ajout à la réponse de Pavan, pour obtenir l'assembly actuel (dans la section générale):
Assembly _assembly;
GetManifestResourceStream (NomFichier) (dans le code, la lecture de la ressource est requise):
try
{
_assembly = Assembly.GetExecutingAssembly();
_textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
Console.WritelLine("Error accessing resource!");
}