Comment lire un fichier texte de ressource incorporé

Comment lire une ressource incorporée (fichier texte) à l’aide de StreamReader et la retourner sous forme de chaîne? Mon script actuel utilise un formulaire et une zone de texte Windows qui permettent à l’utilisateur de rechercher et de remplacer du texte dans un fichier texte non intégré.

 private void button1_Click(object sender, EventArgs e) { SsortingngCollection strValuesToSearch = new SsortingngCollection(); strValuesToSearch.Add("Apple"); ssortingng ssortingngToReplace; ssortingngToReplace = textBox1.Text; StreamReader FileReader = new StreamReader(@"C:\MyFile.txt"); ssortingng FileContents; FileContents = FileReader.ReadToEnd(); FileReader.Close(); foreach (ssortingng s in strValuesToSearch) { if (FileContents.Contains(s)) FileContents = FileContents.Replace(s, ssortingngToReplace); } StreamWriter FileWriter = new StreamWriter(@"MyFile.txt"); FileWriter.Write(FileContents); FileWriter.Close(); } 

Vous pouvez utiliser la méthode Assembly.GetManifestResourceStream :

  1. Ajouter les utilisations suivantes

     using System.IO; using System.Reflection; 
  2. Définir la propriété du fichier concerné:
    Build Action paramètre avec la valeur Embedded Resource

  3. Utilisez le code suivant

 var assembly = Assembly.GetExecutingAssembly(); var resourceName = "MyCompany.MyProduct.MyFile.txt"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) { ssortingng result = reader.ReadToEnd(); } 

resourceName est le nom de l’une des ressources incorporées dans l’ assembly . Par exemple, si vous incorporez un fichier texte nommé "MyFile.txt" qui est placé à la racine d’un projet avec un espace de noms par défaut "MyCompany.MyProduct" , resourceName est "MyCompany.MyProduct.MyFile.txt" . Vous pouvez obtenir une liste de toutes les ressources dans un assembly à l’aide de la méthode Assembly.GetManifestResourceNames .

Vous pouvez append un fichier en tant que ressource en utilisant deux méthodes distinctes.

Le code C # requirejs pour accéder au fichier est différent , en fonction de la méthode utilisée pour append le fichier en premier lieu.

Méthode 1: Ajouter un fichier existant, définissez la propriété sur Embedded Resource

Ajoutez le fichier à votre projet, puis définissez le type sur Embedded Resource .

Remarque: si vous ajoutez le fichier à l’aide de cette méthode, vous pouvez utiliser GetManifestResourceStream pour y accéder (voir la réponse à partir de @dtb).

entrer la description de l'image ici

Méthode 2: Ajouter un fichier à Resources.resx

Ouvrez le fichier Resources.resx , utilisez la liste déroulante pour append le fichier, définissez Access Modifier sur public .

REMARQUE: Si vous ajoutez le fichier à l’aide de cette méthode, vous pouvez utiliser Properties.Resources pour y accéder (voir la réponse de @Night Walker).

entrer la description de l'image ici

Jetez un oeil à cette page: http://support.microsoft.com/kb/319292

Fondamentalement, vous utilisez System.Reflection pour obtenir une référence à l’assembly actuel. Ensuite, vous utilisez GetManifestResourceStream() .

Exemple, à partir de la page que j’ai posté:

Remarque : besoin d’append à l’ using System.Reflection; pour que cela fonctionne

  Assembly _assembly; StreamReader _textStreamReader; try { _assembly = Assembly.GetExecutingAssembly(); _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt")); } catch { MessageBox.Show("Error accessing resources!"); } 

Dans Visual Studio, vous pouvez directement intégrer l’access à une ressource de fichier via l’onglet Ressources des propriétés du projet (“Analytics” dans cet exemple). Capture d'écran du studio visuel - Onglet Ressources

Le fichier résultant peut alors être accédé comme un tableau d’octets par

 byte[] jsonSecrets = GoogleAnalyticsExtractor.Properties.Resources.client_secrets_reporter; 

Si vous en avez besoin comme un stream, alors (à partir de https://stackoverflow.com/a/4736185/432976 )

 Stream stream = new MemoryStream(jsonSecrets) 

Lorsque vous avez ajouté le fichier aux ressources, vous devez sélectionner ses modificateurs d’access en tant que public, ce que vous pouvez faire comme suit.

 byte[] clistAsByteArray = Properties.Resources.CLIST01; 

CLIST01 est le nom du fichier incorporé.

En fait, vous pouvez aller dans le fichier resources.Designer.cs et voir quel est le nom du getter.

Je sais que c’est un vieux sujet, mais c’est ce qui a fonctionné pour moi:

  1. append le fichier texte aux ressources du projet
  2. définir le modificateur d’access sur public, comme indiqué ci-dessus par Andrew Hill
  3. lisez le texte comme ceci:

     textBox1 = new TextBox(); textBox1.Text = Properties.Resources.SomeText; 

Le texte que j’ai ajouté aux ressources: ‘SomeText.txt’

Vous pouvez également utiliser cette version simplifiée de la réponse de @dtb:

 public ssortingng GetEmbeddedResource(ssortingng ns, ssortingng res) { using (var reader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(ssortingng.Format("{0}.{1}", ns, res)))) { return reader.ReadToEnd(); } } 

Quelque chose que j’ai appris tout à l’heure, c’est que votre fichier n’est pas autorisé à avoir un “.” (point) dans le nom du fichier.

UNE

Templates.plainEmailBodyTemplate-fr.txt -> Fonctionne !!!
Templates.plainEmailBodyTemplate.en.txt -> ne fonctionne pas via GetManifestResourceStream ()

Probablement parce que le framework devient confus par rapport aux espaces de noms et aux noms de fichiers …

Ajouter par exemple le fichier de projet Testfile.sql -> Propriétés -> Ressources -> Ajouter un fichier existant

  ssortingng queryFromResourceFile = Properties.Resources.Testfile.ToSsortingng(); 

Je lis un fichier texte de ressource incorporé utilisé:

  ///  /// Converts to generic list a byte array ///  /// byte array (embedded resource) /// generic list of ssortingngs private List GetLines(byte[] content) { ssortingng s = Encoding.Default.GetSsortingng(content, 0, content.Length - 1); return new List(s.Split(new[] { Environment.NewLine }, SsortingngSplitOptions.None)); } 

Échantillon:

 var template = GetLines(Properties.Resources.LasTemplate /* resource name */); template.ForEach(ln => { Debug.WriteLine(ln); }); 

Grâce à toutes vos puissances combinées, j’utilise cette classe auxiliaire pour lire les ressources de tout assembly et de tout espace de noms de manière générique.

 public class ResourceReader { public static IEnumerable FindEmbededResources(Func predicate) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return GetEmbededResourceNames() .Where(predicate) .Select(name => ReadEmbededResource(typeof(TAssembly), name)) .Where(x => !ssortingng.IsNullOrEmpty(x)); } public static IEnumerable GetEmbededResourceNames() { var assembly = Assembly.GetAssembly(typeof(TAssembly)); return assembly.GetManifestResourceNames(); } public static ssortingng ReadEmbededResource(ssortingng name) { if (ssortingng.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name)); return ReadEmbededResource(typeof(TAssembly), typeof(TNamespace), name); } public static ssortingng ReadEmbededResource(Type assemblyType, Type namespaceType, ssortingng name) { if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType)); if (namespaceType == null) throw new ArgumentNullException(nameof(namespaceType)); if (ssortingng.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name)); return ReadEmbededResource(assemblyType, $"{namespaceType.Namespace}.{name}"); } public static ssortingng ReadEmbededResource(Type assemblyType, ssortingng name) { if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType)); if (ssortingng.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name)); var assembly = Assembly.GetAssembly(assemblyType); using (var resourceStream = assembly.GetManifestResourceStream(name)) { if (resourceStream == null) return null; using (var streamReader = new StreamReader(resourceStream)) { return streamReader.ReadToEnd(); } } } } 

Je sais que c’est vieux, mais je voulais juste signaler pour NETMF (.Net MicroFramework), vous pouvez facilement faire ceci:

 ssortingng response = Resources.GetSsortingng(Resources.SsortingngResources.MyFileName); 

Puisque NETMF n’a pas GetManifestResourceStream

J’étais contrarié que vous deviez toujours inclure l’espace de noms et le dossier dans la chaîne. Je voulais simplifier l’access aux ressources intégrées. C’est pourquoi j’ai écrit cette petite classe. N’hésitez pas à utiliser et à améliorer!

Usage:

 using(Stream stream = EmbeddedResources.ExecutingResources.GetStream("filename.txt")) { //... } 

Classe:

 public class EmbeddedResources { private static readonly Lazy _callingResources = new Lazy(() => new EmbeddedResources(Assembly.GetCallingAssembly())); private static readonly Lazy _entryResources = new Lazy(() => new EmbeddedResources(Assembly.GetEntryAssembly())); private static readonly Lazy _executingResources = new Lazy(() => new EmbeddedResources(Assembly.GetExecutingAssembly())); private readonly Assembly _assembly; private readonly ssortingng[] _resources; public EmbeddedResources(Assembly assembly) { _assembly = assembly; _resources = assembly.GetManifestResourceNames(); } public static EmbeddedResources CallingResources => _callingResources.Value; public static EmbeddedResources EntryResources => _entryResources.Value; public static EmbeddedResources ExecutingResources => _executingResources.Value; public Stream GetStream(ssortingng resName) => _assembly.GetManifestResourceStream(_resources.Single(s => s.Contains(resName))); } 

Après avoir lu toutes les solutions affichées ici. Voici comment je l’ai résolu:

 // How to embedded a "Text file" inside of a C# project // and read it as a resource from c# code: // // (1) Add Text File to Project. example: 'myfile.txt' // // (2) Change Text File Properties: // Build-action: EmbeddedResource // Logical-name: myfile.txt // (note only 1 dot permitted in filename) // // (3) from c# get the ssortingng for the entire embedded file as follows: // // ssortingng myfile = GetEmbeddedResourceFile("myfile.txt"); public static ssortingng GetEmbeddedResourceFile(ssortingng filename) { var a = System.Reflection.Assembly.GetExecutingAssembly(); using (var s = a.GetManifestResourceStream(filename)) using (var r = new System.IO.StreamReader(s)) { ssortingng result = r.ReadToEnd(); return result; } return ""; } 

Lisez le fichier TXT incorporé dans l’événement de chargement de formulaire.

Définissez les variables de manière dynamic.

 ssortingng f1 = "AppName.File1.Ext"; ssortingng f2 = "AppName.File2.Ext"; ssortingng f3 = "AppName.File3.Ext"; 

Appelez un Try Catch.

 try { IncludeText(f1,f2,f3); /// Pass the Resources Dynamically /// through the call stack. } catch (Exception Ex) { MessageBox.Show(Ex.Message); /// Error for if the Stream is Null. } 

Create Void for IncludeText (), Visual Studio le fait pour vous. Cliquez sur l’ampoule pour générer automatiquement le codeBlock.

Mettez les éléments suivants dans le bloc de code généré

Ressource 1

 var assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream(file1)) using (StreamReader reader = new StreamReader(stream)) { ssortingng result1 = reader.ReadToEnd(); richTextBox1.AppendText(result1 + Environment.NewLine + Environment.NewLine ); } 

Ressource 2

 var assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream(file2)) using (StreamReader reader = new StreamReader(stream)) { ssortingng result2 = reader.ReadToEnd(); richTextBox1.AppendText( result2 + Environment.NewLine + Environment.NewLine ); } 

Ressource 3

 var assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream(file3)) using (StreamReader reader = new StreamReader(stream)) { ssortingng result3 = reader.ReadToEnd(); richTextBox1.AppendText(result3); } 

Si vous souhaitez envoyer la variable renvoyée ailleurs, appelez simplement une autre fonction et …

 using (StreamReader reader = new StreamReader(stream)) { ssortingng result3 = reader.ReadToEnd(); ///richTextBox1.AppendText(result3); ssortingng extVar = result3; /// another try catch here. try { SendVariableToLocation(extVar) { //// Put Code Here. } } catch (Exception ex) { Messagebox.Show(ex.Message); } } 

Cela a permis de combiner plusieurs fichiers txt et de lire leurs données incorporées dans une seule zone de texte enrichi. ce qui était mon effet désiré avec cet exemple de code.