Pregunta Cómo leer el archivo de texto de recurso incrustado


¿Cómo leo un recurso incrustado (archivo de texto) usando StreamReader y devolverlo como una cadena? Mi script actual usa un formulario y un cuadro de texto de Windows que le permite al usuario encontrar y reemplazar texto en un archivo de texto que no está incrustado.

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

527
2017-07-22 22:51


origen


Respuestas:


Puedes usar el Assembly.GetManifestResourceStream Método:

  1. Agregue los siguientes usos

    using System.IO;
    using System.Reflection;
    
  2. Establecer propiedad del archivo relevante:
    Parámetro Build Action con valor Embedded Resource

  3. Usa el siguiente código

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 es el nombre de uno de los recursos integrados en assembly. Por ejemplo, si incrusta un archivo de texto llamado "MyFile.txt" que se coloca en la raíz de un proyecto con espacio de nombres predeterminado "MyCompany.MyProduct", entonces resourceName es "MyCompany.MyProduct.MyFile.txt". Puede obtener una lista de todos los recursos en un ensamblado usando el Assembly.GetManifestResourceNames Método.


906
2017-07-22 23:03



Puede agregar un archivo como recurso usando dos métodos separados.

El código de C # requerido para acceder al archivo es diferente, según el método utilizado para agregar el archivo en primer lugar.

Método 1: Agregue el archivo existente, establezca la propiedad en Embedded Resource

Agregue el archivo a su proyecto, luego configure el tipo para Embedded Resource.

NOTA: si agrega el archivo con este método, puede usar GetManifestResourceStream para acceder a él (ver respuesta de @dtb).

enter image description here

Método 2: Agregar archivo a Resources.resx

Abre el Resources.resx archivo, utilice el cuadro desplegable para agregar el archivo, establecer Access Modifier a public.

NOTA: si agrega el archivo con este método, puede usar Properties.Resources para acceder a él (ver respuesta de @Night Walker).

enter image description here


104
2017-10-27 10:00



Echa un vistazo a esta página: http://support.microsoft.com/kb/319292

Básicamente, tu usas System.Reflection para obtener una referencia a la Asamblea actual. Entonces, tu usas GetManifestResourceStream().

Ejemplo, de la página que publiqué:

Nota: necesita agregar using System.Reflection; para que esto funcione

   Assembly _assembly;
   StreamReader _textStreamReader;

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

83
2017-07-22 23:01



En Visual Studio puede incrustar directamente el acceso a un recurso de archivo a través de la pestaña Recursos de las propiedades del Proyecto ("Analíticas" en este ejemplo). visual studio screen shot - Resources tab

El archivo resultante se puede acceder como una matriz de bytes por

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

Si lo necesita como una secuencia, entonces (desde https://stackoverflow.com/a/4736185/432976 )

Stream stream = new MemoryStream(jsonSecrets)

65
2017-10-24 01:26



Cuando agregaste el archivo a los recursos, debes seleccionar sus modificadores de acceso como públicos, de lo que puedes hacer algo como lo siguiente.

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 es el nombre del archivo incrustado.

En realidad, puedes ir a resources.Designer.cs y ver cuál es el nombre del getter.


25
2018-04-20 16:34



Sé que es un hilo viejo, pero esto es lo que funcionó para mí:

  1. agregue el archivo de texto a los recursos del proyecto
  2. establecer el modificador de acceso en público, como se muestra arriba por Andrew Hill
  3. lee el texto así:

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

El texto que agregué a los recursos: 'SomeText.txt'


12
2017-12-30 14:08



También puede usar esta versión simplificada de la respuesta de @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();
    }
}

7
2017-07-08 19:14