¿Cómo incrustar un archivo de texto en un ensamblado .NET?

118

Me gustaría incrustar un archivo de texto en un ensamblado para poder cargar el texto sin tener que leerlo desde el disco, y para que todo lo que necesito esté contenido dentro del exe. (Para que sea más portátil)

¿Hay alguna forma de hacer esto? ¿Asumo algo con los archivos de recursos?

Y si puede, ¿cómo lo hace y cómo carga programáticamente el texto en una cadena?

Adam Haile
fuente

Respuestas:

147

Haga clic con el botón derecho en el archivo del proyecto y seleccione Propiedades.

En la ventana que se abre, vaya a la pestaña Recursos y, si solo tiene un enlace azul en el medio de la página de la pestaña, haga clic en él para crear un nuevo recurso.

ingrese la descripción de la imagen aquí

Luego, desde la barra de herramientas sobre la página de pestañas, seleccione para agregar un nuevo archivo de texto, asígnele un nombre, se agregará a su proyecto y se abrirá.

Si llega hasta aquí, entonces en su código puede escribir Resources.TheNameYouGaveTheTextFileHere y puede acceder a su contenido. Tenga en cuenta que la primera vez que use la clase Resources en una clase, debe agregar una directiva using (presione Ctrl +. Después de escribir Resources para obtener el menú para que VS lo haga por usted).

Si algo no estaba claro sobre la descripción anterior, deje un comentario y lo editaré hasta que esté completo o tenga sentido :)

Lasse V. Karlsen
fuente
1
¿Cómo se vería el código de la directiva 'using'? Estoy luchando para que esto funcione. Agregué solutions.txt como recurso, pero no puede encontrar Resources.solutions; siento que me falta la directiva using.
Spedge
3
Ah-hah, todo lo que necesitaba hacer era agregar un My. al frente (es decir, My.Resources.solutions) ¡Simples!
Spedge
2
Agregar un recurso genera e incluye Properties\Resources.Designer.cscon namespace YourProjectRootNamespace.Properties, por lo que debe usar YourProjectRootNamespace.Properties. ProjectRootNamespacese define en las propiedades de su proyecto en VisualStudio.
ilyaigpetrov
1
Si agrego un archivo de texto de esta manera y digo que el archivo de texto es parte de mi solución ... si ese archivo se actualiza y reconstruyo el ensamblaje, ¿el recurso incrustado también se actualizará? ¿O tendré que eliminar / volver a agregar manualmente el archivo si alguna vez lo cambio?
Peter Tirrell
3
Los archivos se empaquetan en recursos durante la compilación, no cuando los agrega. Puede cambiar libremente el archivo en cualquier herramienta que desee y reconstruir, los cambios serán parte de su ensamblaje.
Lasse V. Karlsen
38

En Visual Studio 2003, Visual Studio 2005 y posiblemente versiones anteriores (esto también funciona en 2008) puede incluir el archivo de texto en su proyecto, luego, en el panel 'Propiedades', configure la acción en 'Recurso incrustado'. Luego puede acceder al archivo como una secuencia usando Assembly.GetManifestResourceStream(string).

Otras respuestas aquí son más convenientes. Incluyo esto para completar.

Tenga en cuenta que este enfoque funcionará para incrustar otros tipos de archivos como imágenes, iconos, sonidos, etc.

Dibujó Noakes
fuente
8
Nota: Utilice el espacio de nombres + nombre de archivo como parámetro para GetManifestResourceStream (), por ejemplo, "MyNamespace.MyTextfile.txt". También puede llamar a GetManifestResourceNames () para obtener una lista de todos los nombres.
Stiefel
32

Después de incrustar un archivo de texto, use ese archivo en cualquier lugar del código como este ...

global::packageName.Properties.Resources.ThatFileName
Narottam Goyal
fuente
3
Este es un enfoque mucho mejor porque arrojará un error del compilador si se elimina el recurso. También elimina errores tipográficos. Gracias por la publicacion.
Ben Gripka
+5. ¿Puedo volver a escribirlo en el archivo dentro del nivel de DLL de C #?
Prajwal Bhat
1
¿Qué pasa si quiero especificar ThatFileNamedesde una variable?
c00000fd
4

Sí, tiene razón: cree un archivo de recursos. Cuando hace eso, no necesita "cargar" la cadena, se hará referencia a ella como Resource.WhateverStringYouDefined.

Otávio Décio
fuente
2

Esto es lo que funcionó para mí. (Necesitaba leer el contenido de un archivo incrustado en un archivo de imagen .NET ejecutable).

Antes de hacer nada, incluya su archivo en su solución en Visual Studio. (En mi caso, VS 2017 Community). Cambié a la carpeta, Solution Explorerluego hice clic con el botón derecho Properties, elegí Add Existing Itemy escogí el archivo. (Diga,. FileName.txt) Luego, mientras todavía está en el Solution Explorer, haga clic con el botón derecho en el archivo incluido, seleccione Propertiesy elija Build Actioncomo Embedded Resource.

Luego usa este código para leer sus bytes:

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

Tenga en cuenta que en este caso no es necesario que agregue ese archivo como recurso como se propuso en la respuesta aceptada .

c00000fd
fuente
1

Aquí esta lo que hice:

  1. Agregué mis archivos (recursos) en Visual Studio haciendo clic derecho en el proyecto.
  2. Haga clic derecho en cada archivo que haya agregado y cambie el "Tipo de compilación" a Recurso incrustado.
  3. Para acceder al recurso:

    a. Obtuve el ensamblado actual usando la función:GetExecutingAssembly()

    si. El recurso que agregué era un archivo de texto, así que lo leí en una secuencia usando GetManifestResourceStream(fileName). La forma en que accedí a los nombres de los archivos es llamandoGetManifestResourceNames()

    C. Ahora use una StreamReader()clase para leer hasta el final del archivo en una variable si eso es lo que desea.

Pavana
fuente
0

Agregando a la respuesta de Pavan, para obtener el ensamblaje actual (en la sección general):

Assembly _assembly;

GetManifestResourceStream (fileName) (en el código, donde se requiere la lectura del recurso):

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
Narjis Hasan
fuente