Cómo leer un archivo de texto de recursos incrustado

Resuelto Me.Close asked hace 14 años • 24 respuestas

¿Cómo leo un recurso incrustado (archivo de texto) StreamReadery lo devuelvo como una cadena? Mi script actual utiliza un formulario de Windows y un cuadro de texto que permite al usuario buscar 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();
}
Me.Close avatar Jul 23 '10 05:07 Me.Close
Aceptado

Puedes utilizar el Assembly.GetManifestResourceStreammétodo :

  1. Agregue los siguientes usos

     using System.IO;
     using System.Reflection;
    
  2. Establecer propiedad del archivo relevante:
    parámetro Build Actioncon valorEmbedded Resource

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

    resourceNamees 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 el espacio de nombres predeterminado "MyCompany.MyProduct", entonces resourceNamees "MyCompany.MyProduct.MyFile.txt". Puede obtener una lista de todos los recursos en un ensamblaje usando el Assembly.GetManifestResourceNamesMétodo .


Una idea obvia para obtener el resourceNamenombre del archivo únicamente (omitiendo el espacio de nombres):

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

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

o como método de extensión asíncrono:

internal static class AssemblyExtensions
{
    public static async Task<string> ReadResourceAsync(this Assembly assembly, string name)
    {
        // Determine path
        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(stream);
        return await reader.ReadToEndAsync();
    }
}

// Usage
string resourceText = await Assembly.GetExecutingAssembly().ReadResourceAsync("myResourceName");
dtb avatar Jul 22 '2010 23:07 dtb

Puede agregar un archivo como recurso utilizando dos métodos distintos.

El código C# necesario para acceder al archivo es diferente , dependiendo del método utilizado para agregar el archivo en primer lugar.

Método 1: agregar un archivo existente, establecer la propiedad enEmbedded Resource

Agregue el archivo a su proyecto, luego establezca el tipo en Embedded Resource.

NOTA: Si agrega el archivo usando este método, puede usarlo GetManifestResourceStreampara acceder a él (consulte la respuesta de @dtb ).

ingrese la descripción de la imagen aquí

Método 2: agregar archivo aResources.resx

Abra el Resources.resxarchivo, use el cuadro desplegable para agregar el archivo, configúrelo Access Modifieren public.

NOTA: Si agrega el archivo usando este método, puede usarlo Properties.Resourcespara acceder a él (consulte la respuesta de @Night Walker ).

ingrese la descripción de la imagen aquí

Contango avatar Oct 27 '2014 10:10 Contango