Come leggere il file di testo delle risorse incorporato


693

Come posso leggere una risorsa incorporata (file di testo) usando StreamReadere restituirla come stringa? Il mio script corrente utilizza un modulo di Windows e una casella di testo che consente all'utente di trovare e sostituire il testo in un file di testo che non è incorporato.

private void button1_Click(object sender, EventArgs e)
{
    StringCollection strValuesToSearch = new StringCollection();
    strValuesToSearch.Add("Apple");
    string stringToReplace;
    stringToReplace = textBox1.Text;

    StreamReader FileReader = new StreamReader(@"C:\MyFile.txt");
    string FileContents;
    FileContents = FileReader.ReadToEnd();
    FileReader.Close();
    foreach (string s in strValuesToSearch)
    {
        if (FileContents.Contains(s))
            FileContents = FileContents.Replace(s, stringToReplace);
    }
    StreamWriter FileWriter = new StreamWriter(@"MyFile.txt");
    FileWriter.Write(FileContents);
    FileWriter.Close();
}

Risposte:


1194

Puoi usare il Assembly.GetManifestResourceStreammetodo :

  1. Aggiungi i seguenti usi

    using System.IO;
    using System.Reflection;
  2. Imposta la proprietà del file pertinente:
    parametro Build Actioncon valoreEmbedded Resource

  3. Usa il seguente codice

var assembly = Assembly.GetExecutingAssembly();
var resourceName = "MyCompany.MyProduct.MyFile.txt";

using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
    string result = reader.ReadToEnd();
}

resourceNameè il nome di una delle risorse incorporate assembly. Ad esempio, se si incorpora un file di testo denominato "MyFile.txt"che viene inserito nella radice di un progetto con spazio dei nomi predefinito "MyCompany.MyProduct", lo resourceNameè "MyCompany.MyProduct.MyFile.txt". È possibile ottenere un elenco di tutte le risorse in un assembly utilizzando il Assembly.GetManifestResourceNamesmetodo .


Un gioco da ragazzi astuto per ottenere il solo resourceNamedal nome del file (passando la roba dello spazio dei nomi):

string resourceName = assembly.GetManifestResourceNames()
  .Single(str => str.EndsWith("YourFileName.txt"));

Un esempio completo:

public string ReadResource(string name)
{
    // Determine path
    var assembly = Assembly.GetExecutingAssembly();
    string resourcePath = name;
    // Format: "{Namespace}.{Folder}.{filename}.{Extension}"
    if (!name.StartsWith(nameof(SignificantDrawerCompiler)))
    {
        resourcePath = assembly.GetManifestResourceNames()
            .Single(str => str.EndsWith(name));
    }

    using (Stream stream = assembly.GetManifestResourceStream(resourcePath))
    using (StreamReader reader = new StreamReader(stream))
    {
        return reader.ReadToEnd();
    }
}

5
@ Me.Chiudi: dai un'occhiata Environment.SpecialFolderper ottenere la cartella del desktop. È necessario tenere presente che la risorsa verrà spaziata in base al suo percorso all'interno del progetto, quindi il suo nome potrebbe non essere giusto file1.txt.
adrianbanks,

15
L'argomento per GetManifestResourceStreamrichiede il percorso come indica @adrian. Se aiuta nessuno, quel sentiero è come mostra ciò che @SimpleCoder nell'esempio: MyNamespace.Filename.Ext. In precedenza avevo provato, MyNamespace.Resources.Filename.Extma questo risulta in un valore nullo.
JYelton,

61
Se la tua risorsa non è direttamente nella radice del progetto, ma in alcune sottocartelle, non dimenticare di inserire anche il nome di questa cartella in resourceName (ad es. "MyProjectNameSpace.MyProjectSubFolder.FileName.FileExtention")
Sasha,

19
Vale la pena dire che la risorsa "Build Action" deve essere impostata come "Embedded Resource"
Illidan,

7
Un punto importante non trattato qui. Se hai salvato il tuo file come tipo di codifica alternativo per far fronte a caratteri dispari (nel mio caso UTF8), potresti leggere un file vuoto quando leggi lo stream. Risolvi questo problema specificando il tipo di codifica nel costruttore del lettore di stream:using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
Kinetic

140

È possibile aggiungere un file come risorsa utilizzando due metodi separati.

Il codice C # richiesto per accedere al file è diverso , a seconda del metodo utilizzato per aggiungere il file in primo luogo.

Metodo 1: aggiungi un file esistente, imposta la proprietà su Embedded Resource

Aggiungi il file al tuo progetto, quindi imposta il tipo su Embedded Resource.

NOTA: se si aggiunge il file utilizzando questo metodo, è possibile utilizzare GetManifestResourceStreamper accedervi (vedere la risposta da @dtb ).

inserisci qui la descrizione dell'immagine

Metodo 2: aggiungi il file a Resources.resx

Aprire il Resources.resxfile, utilizzare la casella a discesa per aggiungere il file, impostare Access Modifiersu public.

NOTA: se si aggiunge il file con questo metodo, è possibile utilizzarlo Properties.Resourcesper accedervi (vedere la risposta di @Night Walker ).

inserisci qui la descrizione dell'immagine


5
Un terzo metodo consiste nell'aggiungere il file al progetto, quindi impostare "Copia nella directory di output" su "Vero". Durante la compilazione, il file viene copiato nella directory di output ed è possibile leggere il file con mezzi normali. Esempio: in un'app WPF quando si desidera visualizzare un'immagine.
Contango,

quindi l'impostazione dell'azione build su Resourcenon fa nulla che ti consenta di leggere l'elemento come risorsa? devi usare EmbeddedResourceo aggiungere a un Resources.resxfile?
Maslow,

3
@Maslow L'impostazione dell'azione di compilazione su "Risorsa" crea una risorsa collegata, mentre l'impostazione dell'azione di compilazione su "Risorsa integrata" compila la risorsa nell'assieme di output. Il termine "risorsa collegata" è un termine elaborato per "copiare il file nella directory di output durante la compilazione" (è quindi possibile leggere il file in fase di esecuzione utilizzando qualsiasi metodo normale). Per ulteriori informazioni sulla differenza tra questi due tipi, vedere Aggiunta e modifica di risorse (Visual C #) all'indirizzo msdn.microsoft.com/en-us/library/7k989cfy(v=vs.90).aspx .
Contango,

Se si desidera utilizzare le risorse in questo modo, ma in modo dinamico, proprio al posto di questo: Properties.Resources.Your_resource_name scrivere questo: Properties.Resources.ResourceManager.GetObject("Your_resource_name").
Lkor,

86

Fondamentalmente, si utilizza System.Reflectionper ottenere un riferimento all'Assemblea corrente. Quindi si usa GetManifestResourceStream().

Esempio, dalla pagina che ho pubblicato:

Nota : è necessario aggiungerlo using System.Reflection;affinché funzioni

   Assembly _assembly;
   StreamReader _textStreamReader;

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

32
+1 Per aver incluso namespacecome parte del nome della risorsa
Kirk Broadhurst

41
var auxList= System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); Questo metodo potrebbe essere molto utile quando vuoi imparare il nome esatto della risorsa. (Tratto dalla domanda stackoverflow.com/questions/27757/… )
Oscar Foley,

69

In Visual Studio è possibile incorporare direttamente l'accesso a una risorsa di file tramite la scheda Risorse delle proprietà del Progetto ("Analytics" in questo esempio). schermata dello studio visivo - scheda Risorse

È quindi possibile accedere al file risultante come array di byte da

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

Dovresti averne bisogno come stream, quindi (da https://stackoverflow.com/a/4736185/432976 )

Stream stream = new MemoryStream(jsonSecrets)

11
Puoi anche usarlo con un file di testo, nel qual caso avresti: stringa jsonSecrets = YourNameSpace.Properties.Resources.YourFileName;
ouflak,

30

Quando hai aggiunto il file alle risorse, dovresti selezionare i Modificatori di accesso come pubblici di quanto puoi fare come segue.

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 è il nome del file incorporato.

In realtà puoi andare su resources.Designer.cs e vedere qual è il nome del getter.


5
Potresti spiegarlo di più? Quando faccio clic con il pulsante destro del mouse-> proprietà su un file in Esplora soluzioni, e poi imposto Actionsu Incorporated ressource, non ho alcun Access Modifierscampo nel pannello delle proprietà. Inoltre, non ho una Propersites.Resourcesclasse, ricevo un The name 'Properties' does not exist in the current contexterrore durante la compilazione del codice.
Suzanne Dupéron,

2
Funzionerà solo se incorpori il file Resources.resx, vedi la mia risposta sui diversi metodi per incorporare i file in un progetto.
Contango,

13

aggiungendo ad es. Testfile.sql Menu Progetto -> Proprietà -> Risorse -> Aggiungi file esistente

    string queryFromResourceFile = Properties.Resources.Testfile.ToString();

inserisci qui la descrizione dell'immagine


2
Restituirà byte [], per i file di testo usare `Encoding.UTF8.GetString (Properties.Resources.Testfile)`
MikeTheCoder,

12

So che è un vecchio thread, ma questo è ciò che ha funzionato per me:

  1. aggiungere il file di testo alle risorse del progetto
  2. impostare il modificatore di accesso su pubblico, come mostrato sopra da Andrew Hill
  3. leggi il testo in questo modo:

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

Il testo che ho aggiunto alle risorse: "SomeText.txt"


8

Puoi anche usare questa versione semplificata della risposta di @ dtb:

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

Sei sicuro di questo? secondo questo questo link sembra che io sono .... stackoverflow.com/questions/1065168/...
Timmerz

8

Qualcosa che ho imparato proprio ora è che al tuo file non è permesso avere un "." (punto) nel nome del file.

A "."  nel nome file non va bene.

Templates.plainEmailBodyTemplate-en.txt -> Works !!!
Templates.plainEmailBodyTemplate.en.txt -> non funziona tramite GetManifestResourceStream ()

Probabilmente perché il framework viene confuso su spazi dei nomi vs nome file ...


3
Scusate. Questo è sbagliato. I punti funzionano. (almeno ha funzionato per me, NET4.5) Non so perché hai avuto questo bug.
Felix Keil,

Sì, funzionano ma fungono da separatore di directory. Templates.plainEmailBodyTemplate.en.txt cercherà la risorsa "\ Templates \ plainEmailBodyTemplate \ en.txt"
Peter Gfader,

No. L'ho provato. GetManifestResourceStream può accedere alle risorse incorporate con più di un punto nel nome file. (NET4.5)
Felix Keil,

1
Ho avuto lo stesso problema in .NET 4.5. I file con punti nel nome non sono stati nemmeno aggiunti alla raccolta di risorse. Il metodo assembly.GetManifestResourceNames () restituisce un elenco vuoto a me. Successivamente ho scoperto che il problema era solo con il codice della lingua. ca.abcd.sk.crt non è stato aggiunto alle risorse mentre ca.abcd.crt è stato aggiunto senza problemi.
a.farkas2508,

1
Ancora corretto nel 2020. Grazie mille per questo, mi stavo impazzendo.
ZeRemz,

8

Con tutti i tuoi poteri combinati utilizzo questa classe di supporto per leggere risorse da qualsiasi assembly e qualsiasi spazio dei nomi in modo generico.

public class ResourceReader
{
    public static IEnumerable<string> FindEmbededResources<TAssembly>(Func<string, bool> predicate)
    {
        if (predicate == null) throw new ArgumentNullException(nameof(predicate));

        return
            GetEmbededResourceNames<TAssembly>()
                .Where(predicate)
                .Select(name => ReadEmbededResource(typeof(TAssembly), name))
                .Where(x => !string.IsNullOrEmpty(x));
    }

    public static IEnumerable<string> GetEmbededResourceNames<TAssembly>()
    {
        var assembly = Assembly.GetAssembly(typeof(TAssembly));
        return assembly.GetManifestResourceNames();
    }

    public static string ReadEmbededResource<TAssembly, TNamespace>(string name)
    {
        if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
        return ReadEmbededResource(typeof(TAssembly), typeof(TNamespace), name);
    }

    public static string ReadEmbededResource(Type assemblyType, Type namespaceType, string name)
    {
        if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType));
        if (namespaceType == null) throw new ArgumentNullException(nameof(namespaceType));
        if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));

        return ReadEmbededResource(assemblyType, $"{namespaceType.Namespace}.{name}");
    }

    public static string ReadEmbededResource(Type assemblyType, string name)
    {
        if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType));
        if (string.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();
            }
        }
    }
}

3
più uno per il pianeta capitano: P
Alok,

4

Ho letto l'uso di un file di testo di risorse incorporato:

    /// <summary>
    /// Converts to generic list a byte array
    /// </summary>
    /// <param name="content">byte array (embedded resource)</param>
    /// <returns>generic list of strings</returns>
    private List<string> GetLines(byte[] content)
    {
        string s = Encoding.Default.GetString(content, 0, content.Length - 1);
        return new List<string>(s.Split(new[] { Environment.NewLine }, StringSplitOptions.None));
    }

Campione:

var template = GetLines(Properties.Resources.LasTemplate /* resource name */);

template.ForEach(ln =>
{
    Debug.WriteLine(ln);
});

3

So che questo è vecchio, ma volevo solo sottolineare NETMF (.Net MicroFramework), puoi farlo facilmente:

string response = Resources.GetString(Resources.StringResources.MyFileName);

Poiché NETMF non haGetManifestResourceStream


3

Dopo aver letto tutte le soluzioni pubblicate qui. Ecco come l'ho risolto:

// 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 string for the entire embedded file as follows:
//
//     string myfile = GetEmbeddedResourceFile("myfile.txt");

public static string GetEmbeddedResourceFile(string filename) {
    var a = System.Reflection.Assembly.GetExecutingAssembly();
    using (var s = a.GetManifestResourceStream(filename))
    using (var r = new System.IO.StreamReader(s))
    {
        string result = r.ReadToEnd();
        return result;
    }
    return "";      
}

3

La risposta è abbastanza semplice, basta farlo se hai aggiunto il file direttamente da resources.resx.

string textInResourceFile = fileNameSpace.Properties.Resources.fileName;

Con quella riga di codice, il testo del file viene letto direttamente dal file e inserito nella variabile stringa.


2

Ero infastidito dal fatto che dovevi includere sempre lo spazio dei nomi e la cartella nella stringa. Volevo semplificare l'accesso alle risorse incorporate. Questo è il motivo per cui ho scritto questa piccola lezione. Sentiti libero di usare e migliorare!

Uso:

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

Classe:

public class EmbeddedResources
{
    private static readonly Lazy<EmbeddedResources> _callingResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetCallingAssembly()));

    private static readonly Lazy<EmbeddedResources> _entryResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetEntryAssembly()));

    private static readonly Lazy<EmbeddedResources> _executingResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetExecutingAssembly()));

    private readonly Assembly _assembly;

    private readonly string[] _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(string resName) => _assembly.GetManifestResourceStream(_resources.Single(s => s.Contains(resName)));

}

1
E la soluzione super semplice: var resName = assembly.GetManifestResourceNames (). Where (i => i.EndsWith (fileName)). FirstOrDefault (); Non funzionerà se metti intere directory nell'assembly, ma per il resto è solo una riga;)
Harry

@Harry sicuro che puoi farlo. In che modo ciò è correlato alla mia risposta? Vuoi migliorare il metodo GetStream? E come gestisci l'ambiguità allora?
Felix Keil,

1
@Estevez utilizzando System; utilizzando System.IO; utilizzando System.Linq; utilizzando System.Reflection;
Felix Keil

2
Per qualche ragione la classe non funziona se inserita in un altro progetto. La chiamata e l'esecuzione di assembly fanno entrambi riferimento all'assembly con questa classe, non a quello che esegue effettivamente i test. Senza inizializzazione statica e pigra va bene, comunque.
Curly Brace,

1
@CurlyBrace Grazie. La valutazione pigra è un vero difetto in questa risposta, perché gli assembly di chiamata ed esecuzione cambiano in base al contesto. Devono essere risolti ad ogni accesso.
Felix Keil,

2

Alcuni tipi di progetti VS .NET non generano automaticamente un file .NET (.resx). I seguenti passaggi aggiungono un file di risorse al progetto:

  1. Fare clic con il tasto destro del mouse sul nodo del progetto e selezionare Aggiungi / Nuovo elemento, scorrere fino a File risorse. Nella casella Nome selezionare un nome appropriato, ad esempio Risorse e fare clic sul pulsante Aggiungi.
  2. Il file di risorse Resources.resx viene aggiunto al progetto e può essere visto come un nodo in Esplora soluzioni.
  3. In realtà, vengono creati due file, c'è anche una classe C # generata automaticamente Resources.Designer.cs. Non modificarlo, è gestito da VS. Il file contiene una classe denominata Resources.

Ora puoi aggiungere un file di testo come risorsa, ad esempio un file XML:

  1. Fare doppio clic su Resources.resx. Selezionare Aggiungi risorsa> Aggiungi file esistente e scorrere fino al file che si desidera includere. Lasciare il valore predefinito Interno per Modifica accesso.
  2. Un'icona rappresenta il nuovo elemento di risorsa. Se selezionato, il riquadro delle proprietà mostra le sue proprietà. Per i file XML, sotto la proprietà Codifica selezionare Unicode (UTF-8) - Codepage 65001 invece della codepage locale predefinita. Per altri file di testo selezionare la codifica corretta di questo file, ad esempio la tabella codici 1252.
  3. Per file di testo come file XML, la classe Resourcesha una proprietà di tipo stringche prende il nome dal file incluso. Se il nome del file è ad esempio RibbonManifest.xml, la proprietà dovrebbe avere il nome RibbonManifest. Il nome esatto si trova nel file di codice Resources.Designer.cs.
  4. Utilizzare la proprietà di stringa come qualsiasi altra proprietà di stringa, per esempio: string xml = Resources.RibbonManifest. La forma generale è ResourceFileName.IncludedTextFileName. Non usare ResourceManager.GetStringpoiché la funzione get della proprietà stringa lo ha già fatto.

1
public class AssemblyTextFileReader
{
    private readonly Assembly _assembly;

    public AssemblyTextFileReader(Assembly assembly)
    {
        _assembly = assembly ?? throw new ArgumentNullException(nameof(assembly));
    }

    public async Task<string> ReadFileAsync(string fileName)
    {
        var resourceName = _assembly.GetManifestResourceName(fileName);

        using (var stream = _assembly.GetManifestResourceStream(resourceName))
        {
            using (var reader = new StreamReader(stream))
            {
                return await reader.ReadToEndAsync();
            }
        }
    }
}

public static class AssemblyExtensions
{
    public static string GetManifestResourceName(this Assembly assembly, string fileName)
    {
        string name = assembly.GetManifestResourceNames().SingleOrDefault(n => n.EndsWith(fileName, StringComparison.InvariantCultureIgnoreCase));

        if (string.IsNullOrEmpty(name))
        {
            throw new FileNotFoundException($"Embedded file '{fileName}' could not be found in assembly '{assembly.FullName}'.", fileName);
        }

        return name;
    }
}

0

Questa è una classe che potresti trovare molto utile per leggere i file di risorse incorporati dall'attuale Assembly:

using System.IO;
using System.Linq;
using System.Text;
using static System.IO.Path;
using static System.Reflection.Assembly;

public static class EmbeddedResourceUtils
{
    public static string ReadFromResourceFile(string endingFileName)
    {
        var assembly = GetExecutingAssembly();
        var manifestResourceNames = assembly.GetManifestResourceNames();

        foreach (var resourceName in manifestResourceNames)
        {
            var fileNameFromResourceName = _GetFileNameFromResourceName(resourceName);
            if (!fileNameFromResourceName.EndsWith(endingFileName))
            {
                continue;
            }

            using (var manifestResourceStream = assembly.GetManifestResourceStream(resourceName))
            {
                if (manifestResourceStream == null)
                {
                    continue;
                }

                using (var streamReader = new StreamReader(manifestResourceStream))
                {
                    return streamReader.ReadToEnd();
                }
            }
        }

        return null;
    }

    // https://stackoverflow.com/a/32176198/3764804
    private static string _GetFileNameFromResourceName(string resourceName)
    {
        var stringBuilder = new StringBuilder();
        var escapeDot = false;
        var haveExtension = false;

        for (var resourceNameIndex = resourceName.Length - 1;
            resourceNameIndex >= 0;
            resourceNameIndex--)
        {
            if (resourceName[resourceNameIndex] == '_')
            {
                escapeDot = true;
                continue;
            }

            if (resourceName[resourceNameIndex] == '.')
            {
                if (!escapeDot)
                {
                    if (haveExtension)
                    {
                        stringBuilder.Append('\\');
                        continue;
                    }

                    haveExtension = true;
                }
            }
            else
            {
                escapeDot = false;
            }

            stringBuilder.Append(resourceName[resourceNameIndex]);
        }

        var fileName = GetDirectoryName(stringBuilder.ToString());
        return fileName == null ? null : new string(fileName.Reverse().ToArray());
    }
}

0

Per tutte le persone che vogliono rapidamente il testo di un file hardcoded in winforms;

  1. Fare clic con il tasto destro del mouse sull'applicazione Esplora soluzioni> Risorse> Aggiungi il file.
  2. Fare clic su di esso e nella scheda delle proprietà impostare "Tipo file" su "Testo".
  3. Nel tuo programma devi solo Resources.<name of resource>.toString();leggere il file.

Non lo consiglierei come best practice o altro, ma funziona rapidamente e fa quello che deve fare.


0

Per gli utenti che utilizzano VB.Net

Imports System.IO
Imports System.Reflection

Dim reader As StreamReader
Dim ass As Assembly = Assembly.GetExecutingAssembly()
Dim sFileName = "MyApplicationName.JavaScript.js" 
Dim reader = New StreamReader(ass.GetManifestResourceStream(sFileName))
Dim sScriptText = reader.ReadToEnd()
reader.Close()

dov'è lo MyApplicationNamespazio dei nomi della mia applicazione. Non è il nome dell'assembly. Questo nome è definito nelle proprietà del progetto (scheda Applicazione).

Se non trovi il nome della risorsa corretto, puoi usare la GetManifestResourceNames()funzione

Dim resourceName() As String = ass.GetManifestResourceNames()

o

Dim sName As String 
    = ass.GetManifestResourceNames()
        .Single(Function(x) x.EndsWith("JavaScript.js"))

o

Dim sNameList 
    = ass.GetManifestResourceNames()
        .Where(Function(x As String) x.EndsWith(".js"))

-1

Leggi il file TXT incorporato sull'evento di caricamento del modulo.

Imposta dinamicamente le variabili.

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

Chiama un tentativo di cattura.

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.
}

Crea vuoto per IncludeText (), Visual Studio Fa questo per te. Fare clic sulla lampadina per generare automaticamente CodeBlock.

Inserisci quanto segue all'interno del blocco di codice generato

Risorsa 1

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

Risorsa 2

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

Risorsa 3

var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file3))

using (StreamReader reader = new StreamReader(stream))
{
    string result3 = reader.ReadToEnd();
    richTextBox1.AppendText(result3);
}

Se desideri inviare la variabile restituita da qualche altra parte, chiama semplicemente un'altra funzione e ...

using (StreamReader reader = new StreamReader(stream))
{
    string result3 = reader.ReadToEnd();
    ///richTextBox1.AppendText(result3);
    string extVar = result3;

    /// another try catch here.

   try {

   SendVariableToLocation(extVar)
   {
         //// Put Code Here.
   }

       }

  catch (Exception ex)
  {
    Messagebox.Show(ex.Message);
  }

}

Ciò che è stato raggiunto è stato questo, un metodo per combinare più file txt e leggere i loro dati incorporati, all'interno di una singola casella di testo. quale era il mio effetto desiderato con questo esempio di codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.