Cómo leer un archivo de texto de recursos incrustado
¿Cómo leo un recurso incrustado (archivo de texto) StreamReader
y 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();
}
Puedes utilizar el Assembly.GetManifestResourceStream
método :
Agregue los siguientes usos
using System.IO; using System.Reflection;
Establecer propiedad del archivo relevante:
parámetroBuild Action
con valorEmbedded Resource
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(); }
resourceName
es el nombre de uno de los recursos integrados enassembly
. 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"
, entoncesresourceName
es"MyCompany.MyProduct.MyFile.txt"
. Puede obtener una lista de todos los recursos en un ensamblaje usando elAssembly.GetManifestResourceNames
Método .
Una idea obvia para obtener el resourceName
nombre 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");
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 GetManifestResourceStream
para acceder a él (consulte la respuesta de @dtb ).
Método 2: agregar archivo aResources.resx
Abra el Resources.resx
archivo, use el cuadro desplegable para agregar el archivo, configúrelo Access Modifier
en public
.
NOTA: Si agrega el archivo usando este método, puede usarlo Properties.Resources
para acceder a él (consulte la respuesta de @Night Walker ).