Come incorporare un file di testo in un assembly .NET?


118

Vorrei incorporare un file di testo in un assembly in modo da poter caricare il testo senza doverlo leggere dal disco e in modo che tutto ciò di cui ho bisogno sia contenuto all'interno dell'exe. (In modo che sia più portatile)

C'è un modo per fare questo? Presumo qualcosa con i file di risorse?

E se puoi, come fai e come carichi programmaticamente il testo in una stringa?

Risposte:


147

Fare clic con il pulsante destro del mouse sul file di progetto, selezionare Proprietà.

Nella finestra che si apre, vai alla scheda Risorse e se ha solo un collegamento blu al centro della scheda, fai clic su di esso per creare una nuova risorsa.

inserisci qui la descrizione dell'immagine

Quindi dalla barra degli strumenti sopra la scheda, selezionare per aggiungere un nuovo file di testo, assegnargli un nome, verrà aggiunto al progetto e aperto.

Se arrivi a questo punto, nel codice puoi digitare Resources.TheNameYouGaveTheTextFileHere e puoi accedere al suo contenuto. Nota che la prima volta che usi la classe Resources in una classe, devi aggiungere una direttiva using (premi Ctrl +. Dopo aver digitato Resources per ottenere il menu in modo che VS lo faccia per te).

Se qualcosa non è chiaro sulla descrizione sopra, lascia un commento e lo modificherò finché non sarà completo o avrà senso :)


1
Come sarebbe il codice della direttiva "using", sto lottando per farlo funzionare. Ho aggiunto solutions.txt come risorsa, ma non riesce a trovare Resources.solutions: sento che mi manca la direttiva using.
Spedge

3
Ah-hah, tutto quello che dovevo fare era aggiungere un file My. in primo piano (cioè My.Resources.solutions) Simples!
Spedge

2
L'aggiunta di una risorsa genera e include Properties\Resources.Designer.cscon namespace YourProjectRootNamespace.Properties, quindi devi usare YourProjectRootNamespace.Properties. ProjectRootNamespaceè definito nelle proprietà del progetto in VisualStudio.
ilyaigpetrov

1
Se aggiungo un file di testo in questo modo e dico che il file di testo fa parte della mia soluzione ... se quel file viene aggiornato e ricostruisco l'assembly, verrà aggiornata anche la risorsa incorporata? O dovrò rimuovere / aggiungere manualmente il file se dovessi cambiarlo?
Peter Tirrell

3
I file vengono inseriti nelle risorse in fase di compilazione, non quando vengono aggiunti. Puoi modificare liberamente il file in qualsiasi strumento ti piaccia e ricostruirlo, le modifiche faranno parte del tuo assieme.
Lasse V. Karlsen

38

In Visual Studio 2003, Visual Studio 2005 e possibilmente versioni precedenti (funziona anche nel 2008) è possibile includere il file di testo nel progetto, quindi nel pannello "Proprietà", impostare l'azione su "Risorsa incorporata". Quindi puoi accedere al file come flusso usando Assembly.GetManifestResourceStream(string).

Altre risposte qui sono più convenienti. Includo questo per completezza.

Nota che questo approccio funzionerà per incorporare altri tipi di file come immagini, icone, suoni, ecc ...


8
Nota: utilizzare lo spazio dei nomi + il nome del file come parametro per GetManifestResourceStream (), ad esempio "MyNamespace.MyTextfile.txt". È inoltre possibile chiamare GetManifestResourceNames () per ottenere un elenco di tutti i nomi.
Stiefel

32

Dopo aver incorporato un file di testo, usa quel file ovunque nel codice come questo ...

global::packageName.Properties.Resources.ThatFileName

3
Questo è un approccio molto migliore perché genererà un errore del compilatore se la risorsa viene rimossa. Elimina anche gli errori di battitura. Grazie per il post.
Ben Gripka

+5. Posso riscriverlo nel file all'interno del livello DLL C #?
Prajwal Bhat,

1
E se volessi specificare ThatFileNameda una variabile?
c00000fd

4

Sì, hai ragione: crea un file di risorse. Quando lo fai non hai bisogno di "caricare" la stringa, sarà referenziata come Resource.WwhatStringYouDefined.


2

Ecco cosa ha funzionato per me. (Avevo bisogno di leggere il contenuto di un file incorporato in un file immagine .NET eseguibile.)

Prima di fare qualsiasi cosa, includi il tuo file nella tua soluzione in Visual Studio. (Nel mio caso VS 2017 Community.) Sono passato alla cartella, Solution Explorerquindi ho fatto clic con il pulsante destro del mouse Properties, ho scelto Add Existing Iteme scelto il file. (Dì,. FileName.txt) Quindi, mentre sei ancora in Solution Explorer, fai clic con il pulsante destro del mouse sul file incluso, seleziona Propertiese scegli Build Actioncome Embedded Resource.

Quindi usa questo codice per leggere i suoi byte:

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();
    }
}

Notare che in questo caso non è necessario aggiungere quel file come risorsa come proposto nella risposta accettata .


1

Ecco cosa ho fatto:

  1. Aggiunti i miei file (risorse) in Visual Studio facendo clic con il pulsante destro del mouse sul progetto.
  2. Fare clic con il pulsante destro del mouse su ogni file aggiunto e modificare il "Tipo build" in Risorsa incorporata.
  3. Per accedere alla risorsa:

    un. Ottenuto l'assembly corrente utilizzando la funzione:GetExecutingAssembly()

    b. La risorsa che ho aggiunto era un file di testo, quindi l'ho letto in un flusso usandoGetManifestResourceStream(fileName) . Il modo in cui ho avuto accesso ai nomi dei file è chiamandoGetManifestResourceNames()

    c. Ora usa una StreamReader()classe per leggere fino alla fine del file in una variabile se è quello che vuoi.


0

Aggiungendo alla risposta di Pavan, per ottenere l'assemblea corrente (nella sezione generale):

Assembly _assembly;

GetManifestResourceStream (fileName) (nel codice, dove è richiesta la lettura dalla risorsa):

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
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.