Como ler o arquivo de texto do recurso incorporado

Como faço para ler um recurso incorporado (arquivo de texto) usando StreamReader e retorná-lo como uma string? Meu script atual usa um formulário do Windows e checkbox de texto que permite ao usuário localizar e replace texto em um arquivo de texto que não está incorporado.

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

Você pode usar o método Assembly.GetManifestResourceStream :

  1. Adicione os seguintes itens

     using System.IO; using System.Reflection; 
  2. Definir propriedade do arquivo relevante:
    Parâmetro Build Action com valor Embedded Resource

  3. Use o seguinte 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 é o nome de um dos resources incorporados na assembly . Por exemplo, se você incorporar um arquivo de texto chamado "MyFile.txt" que é colocado na raiz de um projeto com o namespace padrão "MyCompany.MyProduct" , o resourceName será "MyCompany.MyProduct.MyFile.txt" . Você pode obter uma lista de todos os resources em um assembly usando o método Assembly.GetManifestResourceNames .

Você pode adicionar um arquivo como um recurso usando dois methods separados.

O código C # necessário para acessar o arquivo é diferente , dependendo do método usado para adicionar o arquivo em primeiro lugar.

Método 1: Adicionar arquivo existente, defina a propriedade como Embedded Resource

Adicione o arquivo ao seu projeto e defina o tipo como Embedded Resource .

NOTA: Se você adicionar o arquivo usando esse método, poderá usar GetManifestResourceStream para acessá-lo (consulte a resposta de @dtb).

insira a descrição da imagem aqui

Método 2: Adicionar arquivo ao Resources.resx

Abra o arquivo Resources.resx , use a checkbox suspensa para adicionar o arquivo, configure o Access Modifier para public .

NOTA: Se você adicionar o arquivo usando esse método, poderá usar o Properties.Resources para acessá-lo (veja a resposta de @Night Walker).

insira a descrição da imagem aqui

Dê uma olhada nesta página: http://support.microsoft.com/kb/319292

Basicamente, você usa System.Reflection para obter uma referência para o atual Assembly. Em seguida, você usa GetManifestResourceStream() .

Exemplo, da página que postei:

Nota : precisa adicionar using System.Reflection; para isso funcionar

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

No Visual Studio, você pode incorporar diretamente o access a um recurso de arquivo por meio da guia Recursos das propriedades do Projeto (“Analytics” neste exemplo). Captura de tela do estúdio visual - guia Recursos

O arquivo resultante pode ser acessado como uma matriz de bytes

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

Se você precisar dele como um stream, então (de https://stackoverflow.com/a/4736185/432976 )

 Stream stream = new MemoryStream(jsonSecrets) 

Quando você adicionou o arquivo aos resources, você deve selecionar seus Modificadores de Acesso como públicos, do que você pode fazer algo como seguir.

 byte[] clistAsByteArray = Properties.Resources.CLIST01; 

CLIST01 é o nome do arquivo incorporado.

Na verdade, você pode ir para o resources.Designer.cs e ver qual é o nome do getter.

Eu sei que é um tópico antigo, mas isso é o que funcionou para mim:

  1. adicione o arquivo de texto aos resources do projeto
  2. definir o modificador de access para público, como mostrado acima por Andrew Hill
  3. leia o texto assim:

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

O texto que adicionei aos resources: ‘SomeText.txt’

Você também pode usar esta versão simplificada da resposta do @ 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(); } } 

Algo que aprendi agora é que seu arquivo não pode ter um “.” (ponto) no nome do arquivo.

UMA

Templates.plainEmailBodyTemplate-en.txt -> Funciona !!!
Templates.plainEmailBodyTemplate.en.txt -> não funciona via GetManifestResourceStream ()

Provavelmente porque o framework fica confuso sobre namespaces vs filename …

adicionando, por exemplo, Testfile.sql Menu Projeto -> Propriedades -> Recursos -> Adicionar Arquivo Existente

  string queryFromResourceFile = Properties.Resources.Testfile.ToString(); 

Eu li um uso de arquivo de texto de recurso incorporado:

  ///  /// Converts to generic list a byte array ///  /// byte array (embedded resource) /// generic list of strings private List GetLines(byte[] content) { string s = Encoding.Default.GetString(content, 0, content.Length - 1); return new List(s.Split(new[] { Environment.NewLine }, StringSplitOptions.None)); } 

Amostra:

 var template = GetLines(Properties.Resources.LasTemplate /* resource name */); template.ForEach(ln => { Debug.WriteLine(ln); }); 

Por todos os seus poderes combinados eu uso essa class auxiliar para ler resources de qualquer assembly e qualquer namespace de uma maneira genérica.

 public class ResourceReader { public static IEnumerable FindEmbededResources(Func predicate) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return GetEmbededResourceNames() .Where(predicate) .Select(name => ReadEmbededResource(typeof(TAssembly), name)) .Where(x => !string.IsNullOrEmpty(x)); } public static IEnumerable GetEmbededResourceNames() { var assembly = Assembly.GetAssembly(typeof(TAssembly)); return assembly.GetManifestResourceNames(); } public static string ReadEmbededResource(string name) { if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name)); return ReadEmbededResource(typeof(TAssembly), typeof(TNamespace), name); } public static string ReadEmbededResource(Type assemblyType, Type namespaceType, string name) { if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType)); if (namespaceType == null) throw new ArgumentNullException(nameof(namespaceType)); if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name)); return ReadEmbededResource(assemblyType, $"{namespaceType.Namespace}.{name}"); } public static string ReadEmbededResource(Type assemblyType, string name) { if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType)); if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name)); var assembly = Assembly.GetAssembly(assemblyType); using (var resourceStream = assembly.GetManifestResourceStream(name)) { if (resourceStream == null) return null; using (var streamReader = new StreamReader(resourceStream)) { return streamReader.ReadToEnd(); } } } } 

Eu sei que isso é antigo, mas eu só queria apontar para NETMF (.Net MicroFramework), você pode facilmente fazer isso:

 string response = Resources.GetString(Resources.StringResources.MyFileName); 

Desde NETMF não tem GetManifestResourceStream

Fiquei irritado por você ter sempre que include o namespace e a pasta na string. Eu queria simplificar o access aos resources incorporados. É por isso que escrevi esta pequena turma. Sinta-se livre para usar e melhorar!

Uso:

 using(Stream stream = EmbeddedResources.ExecutingResources.GetStream("filename.txt")) { //... } 

Classe:

 public class EmbeddedResources { private static readonly Lazy _callingResources = new Lazy(() => new EmbeddedResources(Assembly.GetCallingAssembly())); private static readonly Lazy _entryResources = new Lazy(() => new EmbeddedResources(Assembly.GetEntryAssembly())); private static readonly Lazy _executingResources = new Lazy(() => new EmbeddedResources(Assembly.GetExecutingAssembly())); private readonly Assembly _assembly; private readonly string[] _resources; public EmbeddedResources(Assembly assembly) { _assembly = assembly; _resources = assembly.GetManifestResourceNames(); } public static EmbeddedResources CallingResources => _callingResources.Value; public static EmbeddedResources EntryResources => _entryResources.Value; public static EmbeddedResources ExecutingResources => _executingResources.Value; public Stream GetStream(string resName) => _assembly.GetManifestResourceStream(_resources.Single(s => s.Contains(resName))); } 

Depois de ler todas as soluções postadas aqui. Foi assim que resolvi:

 // How to embedded a "Text file" inside of a C# project // and read it as a resource from c# code: // // (1) Add Text File to Project. example: 'myfile.txt' // // (2) Change Text File Properties: // Build-action: EmbeddedResource // Logical-name: myfile.txt // (note only 1 dot permitted in filename) // // (3) from c# get the string for the entire embedded file as follows: // // string myfile = GetEmbeddedResourceFile("myfile.txt"); public static string GetEmbeddedResourceFile(string filename) { var a = System.Reflection.Assembly.GetExecutingAssembly(); using (var s = a.GetManifestResourceStream(filename)) using (var r = new System.IO.StreamReader(s)) { string result = r.ReadToEnd(); return result; } return ""; } 

Leia o ARQUIVO TXT incorporado no evento de carregamento de formulário.

Defina as variables ​​dinamicamente.

 string f1 = "AppName.File1.Ext"; string f2 = "AppName.File2.Ext"; string f3 = "AppName.File3.Ext"; 

Chame um Try Catch.

 try { IncludeText(f1,f2,f3); /// Pass the Resources Dynamically /// through the call stack. } catch (Exception Ex) { MessageBox.Show(Ex.Message); /// Error for if the Stream is Null. } 

Criar Void para IncludeText (), Visual Studio Faz isso por você. Clique na lâmpada para gerar automaticamente o CodeBlock.

Coloque o seguinte dentro do bloco de código gerado

Recurso 1

 var assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream(file1)) using (StreamReader reader = new StreamReader(stream)) { string result1 = reader.ReadToEnd(); richTextBox1.AppendText(result1 + Environment.NewLine + Environment.NewLine ); } 

Recurso 2

 var assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream(file2)) using (StreamReader reader = new StreamReader(stream)) { string result2 = reader.ReadToEnd(); richTextBox1.AppendText( result2 + Environment.NewLine + Environment.NewLine ); } 

Recurso 3

 var assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream(file3)) using (StreamReader reader = new StreamReader(stream)) { string result3 = reader.ReadToEnd(); richTextBox1.AppendText(result3); } 

Se você deseja enviar a variável retornada para algum outro lugar, basta chamar outra function e …

 using (StreamReader reader = new StreamReader(stream)) { string result3 = reader.ReadToEnd(); ///richTextBox1.AppendText(result3); string extVar = result3; /// another try catch here. try { SendVariableToLocation(extVar) { //// Put Code Here. } } catch (Exception ex) { Messagebox.Show(ex.Message); } } 

O que isso conseguiu foi este, um método para combinar vários arquivos txt e ler seus dados incorporados, dentro de uma única checkbox de rich text. qual foi o meu efeito desejado com esta amostra de código.