Como ler o arquivo de texto de recurso incorporado

693

Como leio um recurso incorporado (arquivo de texto) usando StreamReadere o retorno como uma string? Meu script atual usa um formulário e caixa de texto do Windows que permite ao usuário localizar e substituir 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();
}
Me.Close
fonte

Respostas:

1194

Você pode usar o Assembly.GetManifestResourceStreammétodo :

  1. Adicione os seguintes usos

    using System.IO;
    using System.Reflection;
  2. Definir propriedade do arquivo relevante:
    Parâmetro Build Actioncom valorEmbedded 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 recursos incorporados assembly. Por exemplo, se você incorporar um arquivo de texto chamado "MyFile.txt"colocado na raiz de um projeto com espaço para nome padrão "MyCompany.MyProduct", resourceNameserá "MyCompany.MyProduct.MyFile.txt". Você pode obter uma lista de todos os recursos em uma montagem usando o Assembly.GetManifestResourceNamesmétodo .


Um esperto astuto para obter resourceNameapenas o nome do arquivo (passe o material do espaço para nome):

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

Um exemplo 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();
    }
}
dtb
fonte
5
@ Me.Close: Dê uma olhada Environment.SpecialFolderpara obter a pasta da área de trabalho. Você precisa ter em mente que o recurso será espaçado por nomes com base em seu caminho no projeto, portanto, seu nome pode não ser justo file1.txt.
adrianbanks
15
O argumento para GetManifestResourceStreamprecisa do caminho como @adrian indica. Se ajudar alguém, esse caminho é como mostra o que @SimpleCoder no exemplo: MyNamespace.Filename.Ext. Eu já havia tentado anteriormente, MyNamespace.Resources.Filename.Extmas isso resulta em um nulo.
JYelton 18/05
61
Se você tiver seu recurso não diretamente na raiz do projeto, mas em algumas subpastas, não se esqueça de colocar também o nome desta pasta em resourceName (por exemplo, "MyProjectNameSpace.MyProjectSubFolder.FileName.FileExtention")
Sasha
19
Vale dizer que o recurso "Build Action" deve ser definido como "Embedded Resource"
Illidan
7
Um ponto importante não abordado aqui. Se você salvou seu arquivo como um tipo de codificação alternativo para lidar com caracteres ímpares (no meu caso UTF8), poderá receber um arquivo vazio ao ler o fluxo. Corrija isso especificando o tipo de codificação no construtor do leitor de fluxo:using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
Kinetic
140

Você pode adicionar um arquivo como um recurso usando dois métodos 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á usá GetManifestResourceStream-lo para acessá-lo (consulte a resposta em @dtb ).

insira a descrição da imagem aqui

Método 2: Adicionar arquivo ao Resources.resx

Abra o Resources.resxarquivo, use a caixa suspensa para adicionar o arquivo, defina Access Modifiercomo public.

NOTA: Se você adicionar o arquivo usando este método, poderá usá Properties.Resources-lo para acessá-lo (consulte a resposta do @Night Walker ).

insira a descrição da imagem aqui

Contango
fonte
5
Um terceiro método é adicionar o arquivo ao projeto e defina "Copiar no diretório de saída" como "Verdadeiro". Na compilação, o arquivo é copiado para o diretório de saída e você pode ler o arquivo usando meios normais. Exemplo: em um aplicativo WPF quando você deseja exibir uma imagem.
Contango 08/07
portanto, definir a ação de compilação como Resourcenão faz nada que permita ler o item como um recurso? você tem que usar EmbeddedResourceou adicionar a um Resources.resxarquivo?
Maslow
3
@Maslow A configuração da ação de compilação como 'Recurso' cria um recurso vinculado, enquanto a configuração da ação de compilação como 'Recurso Incorporado' compila o recurso no assembly de saída. O termo 'recurso vinculado' é um termo sofisticado para 'copiar o arquivo no diretório de saída ao compilar' (você pode ler o arquivo em tempo de execução usando qualquer método normal). Para saber mais sobre a diferença entre esses dois tipos, consulte Adicionando e editando recursos (Visual C #) em msdn.microsoft.com/en-us/library/7k989cfy(v=vs.90).aspx .
Contango
Se você gostaria de usar recursos desta maneira, mas de forma dinâmica, apenas em vez disso: Properties.Resources.Your_resource_name escrever este: Properties.Resources.ResourceManager.GetObject("Your_resource_name").
Lkor 21/04
86

Basicamente, você usa System.Reflectionpara obter uma referência à montagem atual. Então você usa GetManifestResourceStream().

Exemplo, na página que publiquei:

Nota : é necessário adicionar using System.Reflection;para que isso funcione

   Assembly _assembly;
   StreamReader _textStreamReader;

   try
   {
      _assembly = Assembly.GetExecutingAssembly();
      _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
   }
   catch
   {
      MessageBox.Show("Error accessing resources!");
   }
Chris Laplante
fonte
32
+1 Para incluir namespacecomo parte do nome do recurso
Kirk Broadhurst 7/07
41
var auxList= System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); Este método pode ser muito útil quando você deseja aprender o nome exato do recurso. (Tomado da questão stackoverflow.com/questions/27757/... )
Oscar Foley
69

No Visual Studio, você pode incorporar diretamente o acesso a um recurso de arquivo através da guia Recursos das propriedades do projeto ("Análise" neste exemplo). captura de tela do visual studio - guia Recursos

O arquivo resultante pode ser acessado como uma matriz de bytes por

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

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

Stream stream = new MemoryStream(jsonSecrets)
Andrew Hill
fonte
11
Você também pode usar isso com um arquivo de texto; nesse caso, você teria: string jsonSecrets = YourNameSpace.Properties.Resources.YourFileName;
ouflak
30

Quando você adicionou o arquivo aos recursos, deve selecionar seus Modificadores de Acesso como públicos, para fazer algo como o seguinte.

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 é o nome do arquivo incorporado.

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

Night Walker
fonte
5
Poderia explicar isso mais? Quando clico com o botão direito do mouse-> em propriedades de um arquivo no Solution Explorer e, em seguida, defino Actioncomo Incorporated ressource, não tenho nenhum Access Modifierscampo no painel de propriedades. Além disso, não tenho uma Propersites.Resourcesclasse, recebo um The name 'Properties' does not exist in the current contexterro ao compilar seu código.
Suzanne Dupéron 19/03/2013
2
Isso só funcionará se você incorporar o arquivo Resources.resx, veja minha resposta sobre os diferentes métodos para incorporar arquivos em um projeto.
Contango 27/10
13

adicionando, por exemplo, o menu Projeto Testfile.sql -> Propriedades -> Recursos -> Adicionar arquivo existente

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

insira a descrição da imagem aqui

miciry89
fonte
2
Ele retornará byte [], para arquivos de texto usar `Encoding.UTF8.GetString (Properties.Resources.Testfile)`
MikeTheCoder
12

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

  1. adicione o arquivo de texto aos recursos do projeto
  2. defina o modificador de acesso como público, como mostrado acima por Andrew Hill
  3. leia o texto assim:

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

O texto que eu adicionei aos recursos: 'SomeText.txt'

S_Teo
fonte
8

Você também pode usar esta versão simplificada da resposta da @ 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();
    }
}
Timmerz
fonte
você tem certeza sobre isso? de acordo com este este link parece que eu sou .... stackoverflow.com/questions/1065168/...
Timmerz
8

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

UMA "."  no nome do arquivo não é bom.

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

Provavelmente porque o framework fica confuso sobre namespaces vs nome do arquivo ...

Peter Gfader
fonte
3
Desculpa. Isto está errado. Pontos funcionam. (pelo menos funcionou para mim, NET4.5) Não sei por que você teve esse bug.
Felix Keil
Sim, eles funcionam, mas atuam como separador de diretório. Templates.plainEmailBodyTemplate.en.txt procurará o recurso "\ Templates \ plainEmailBodyTemplate \ en.txt"
Peter Gfader 16/15
Não. Eu tentei. GetManifestResourceStream pode acessar recursos incorporados com mais de um ponto no nome do arquivo. (NET4.5)
Felix Keil
1
Eu tive um mesmo problema no .NET 4.5. Arquivos com pontos no nome nem foram adicionados à coleção de recursos. O método assembly.GetManifestResourceNames () retorna uma lista vazia para mim. Mais tarde, descobri que o problema era apenas com o código do idioma. ca.abcd.sk.crt não foi adicionado aos recursos, enquanto ca.abcd.crt foi adicionado sem problemas.
a.farkas2508 06/06/19
1
Ainda correto em 2020. Muito obrigado por isso, eu estava ficando louco com isso.
ZeRemz
8

Por todos os seus poderes combinados, eu uso essa classe auxiliar para ler recursos de qualquer assembly e qualquer namespace de maneira genérica.

public class ResourceReader
{
    public static IEnumerable<string> FindEmbededResources<TAssembly>(Func<string, bool> predicate)
    {
        if (predicate == null) throw new ArgumentNullException(nameof(predicate));

        return
            GetEmbededResourceNames<TAssembly>()
                .Where(predicate)
                .Select(name => ReadEmbededResource(typeof(TAssembly), name))
                .Where(x => !string.IsNullOrEmpty(x));
    }

    public static IEnumerable<string> GetEmbededResourceNames<TAssembly>()
    {
        var assembly = Assembly.GetAssembly(typeof(TAssembly));
        return assembly.GetManifestResourceNames();
    }

    public static string ReadEmbededResource<TAssembly, TNamespace>(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();
            }
        }
    }
}
t3chb0t
fonte
3
mais um para o capitão planeta: P
Alok
4

Eu li um arquivo de texto de recurso incorporado:

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

Amostra:

var template = GetLines(Properties.Resources.LasTemplate /* resource name */);

template.ForEach(ln =>
{
    Debug.WriteLine(ln);
});
Harveyt
fonte
3

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

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

Como o NETMF não possuiGetManifestResourceStream

dreamwork801
fonte
3

Depois de ler todas as soluções postadas aqui. Foi assim que eu 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 "";      
}
Bill Moore
fonte
3

A resposta é bastante simples, basta fazer isso se você adicionou o arquivo diretamente do resources.resx.

string textInResourceFile = fileNameSpace.Properties.Resources.fileName;

Com essa linha de código, o texto do arquivo é lido diretamente do arquivo e colocado na variável string.

Jamisco
fonte
2

Fiquei aborrecido por você sempre incluir o espaço para nome e a pasta na string. Eu queria simplificar o acesso aos recursos incorporados. Foi 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<EmbeddedResources> _callingResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetCallingAssembly()));

    private static readonly Lazy<EmbeddedResources> _entryResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetEntryAssembly()));

    private static readonly Lazy<EmbeddedResources> _executingResources = new Lazy<EmbeddedResources>(() => 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)));

}
Felix Keil
fonte
1
E a solução super simples: var resName = assembly.GetManifestResourceNames (). Where (i => i.EndsWith (fileName)). FirstOrDefault (); Não vai funcionar se você colocar diretórios inteiros em conjunto, mas caso contrário, é apenas uma linha;)
Harry
@ Harry certo de que você pode fazer isso. Como isso se correlaciona com a minha resposta? Deseja melhorar o método GetStream? E como você lida com a ambiguidade, então?
Felix Keil
1
@Estevez using System; using System.IO; using System.Linq; using System.Reflection;
Felix Keil #
2
Por alguma razão, a classe não funciona quando colocada em outro projeto. A chamada e a execução de assemblies referem-se ao assembly dessa classe, não àquele que realmente executa testes. Sem inicialização estática e preguiçosa tudo de bom, tho.
Curly Brace
1
@CurlyBrace Obrigado. A avaliação preguiçosa é uma falha real nesta resposta, porque os assemblies de chamada e execução mudam dependendo do contexto. Eles precisam ser resolvidos em todos os acessos.
Felix Keil
2

Alguns tipos de projeto do VS .NET não geram automaticamente um arquivo .NET (.resx). As etapas a seguir adicionam um arquivo de recursos ao seu projeto:

  1. Clique com o botão direito do mouse no nó do projeto e selecione Adicionar / Novo Item, role para Arquivo de Recursos. Na caixa Nome, escolha um nome apropriado, por exemplo, Recursos e clique no botão Adicionar.
  2. O arquivo de recurso Resources.resx é adicionado ao projeto e pode ser visto como um nó no gerenciador de soluções.
  3. Na verdade, dois arquivos são criados, também há uma classe C # gerada automaticamente Resources.Designer.cs. Não edite, ele é mantido pelo VS. O arquivo contém uma classe chamada Resources.

Agora você pode adicionar um arquivo de texto como um recurso, por exemplo, um arquivo xml:

  1. Clique duas vezes em Resources.resx. Selecione Adicionar recurso> Adicionar arquivo existente e vá até o arquivo que você deseja incluir. Deixe o valor padrão Internal for Access Modify.
  2. Um ícone representa o novo item de recurso. Se selecionado, o painel de propriedades mostra suas propriedades. Para arquivos xml, na propriedade Codificação, selecione Unicode (UTF-8) - Página de códigos 65001 em vez da página de códigos local padrão. Para outros arquivos de texto, selecione a codificação correta desse arquivo, por exemplo, a página de código 1252.
  3. Para arquivos de texto como arquivos xml, a classe Resourcespossui uma propriedade do tipo stringque é nomeada após o arquivo incluído. Se o nome do arquivo é, por exemplo RibbonManifest.xml, em seguida, a propriedade deve ter o nome RibbonManifest. Você encontra o nome exato no arquivo de código Resources.Designer.cs.
  4. Use a propriedade string como qualquer outra propriedade de cadeia, por exemplo: string xml = Resources.RibbonManifest. A forma geral é ResourceFileName.IncludedTextFileName. Não use, ResourceManager.GetStringpois a função get da propriedade string já fez isso.
Dietrich Baumgarten
fonte
1
public class AssemblyTextFileReader
{
    private readonly Assembly _assembly;

    public AssemblyTextFileReader(Assembly assembly)
    {
        _assembly = assembly ?? throw new ArgumentNullException(nameof(assembly));
    }

    public async Task<string> ReadFileAsync(string fileName)
    {
        var resourceName = _assembly.GetManifestResourceName(fileName);

        using (var stream = _assembly.GetManifestResourceStream(resourceName))
        {
            using (var reader = new StreamReader(stream))
            {
                return await reader.ReadToEndAsync();
            }
        }
    }
}

public static class AssemblyExtensions
{
    public static string GetManifestResourceName(this Assembly assembly, string fileName)
    {
        string name = assembly.GetManifestResourceNames().SingleOrDefault(n => n.EndsWith(fileName, StringComparison.InvariantCultureIgnoreCase));

        if (string.IsNullOrEmpty(name))
        {
            throw new FileNotFoundException($"Embedded file '{fileName}' could not be found in assembly '{assembly.FullName}'.", fileName);
        }

        return name;
    }
}
bytedev
fonte
0

Esta é uma classe que você pode achar muito conveniente para ler arquivos de recursos incorporados do atual Assembly:

using System.IO;
using System.Linq;
using System.Text;
using static System.IO.Path;
using static System.Reflection.Assembly;

public static class EmbeddedResourceUtils
{
    public static string ReadFromResourceFile(string endingFileName)
    {
        var assembly = GetExecutingAssembly();
        var manifestResourceNames = assembly.GetManifestResourceNames();

        foreach (var resourceName in manifestResourceNames)
        {
            var fileNameFromResourceName = _GetFileNameFromResourceName(resourceName);
            if (!fileNameFromResourceName.EndsWith(endingFileName))
            {
                continue;
            }

            using (var manifestResourceStream = assembly.GetManifestResourceStream(resourceName))
            {
                if (manifestResourceStream == null)
                {
                    continue;
                }

                using (var streamReader = new StreamReader(manifestResourceStream))
                {
                    return streamReader.ReadToEnd();
                }
            }
        }

        return null;
    }

    // https://stackoverflow.com/a/32176198/3764804
    private static string _GetFileNameFromResourceName(string resourceName)
    {
        var stringBuilder = new StringBuilder();
        var escapeDot = false;
        var haveExtension = false;

        for (var resourceNameIndex = resourceName.Length - 1;
            resourceNameIndex >= 0;
            resourceNameIndex--)
        {
            if (resourceName[resourceNameIndex] == '_')
            {
                escapeDot = true;
                continue;
            }

            if (resourceName[resourceNameIndex] == '.')
            {
                if (!escapeDot)
                {
                    if (haveExtension)
                    {
                        stringBuilder.Append('\\');
                        continue;
                    }

                    haveExtension = true;
                }
            }
            else
            {
                escapeDot = false;
            }

            stringBuilder.Append(resourceName[resourceNameIndex]);
        }

        var fileName = GetDirectoryName(stringBuilder.ToString());
        return fileName == null ? null : new string(fileName.Reverse().ToArray());
    }
}
BullyWiiPlaza
fonte
0

Para todas as pessoas que desejam rapidamente o texto de um arquivo codificado em winforms;

  1. Clique com o botão direito do mouse no seu aplicativo no Solution Explorer> Recursos> Adicionar seu arquivo.
  2. Clique nele e, na guia de propriedades, defina o "FileType" como "Text".
  3. No seu programa, basta fazer Resources.<name of resource>.toString();para ler o arquivo.

Eu não recomendaria isso como prática recomendada ou algo assim, mas funciona rapidamente e faz o que precisa.

SwatDoge
fonte
0

Para usuários que estão usando o VB.Net

Imports System.IO
Imports System.Reflection

Dim reader As StreamReader
Dim ass As Assembly = Assembly.GetExecutingAssembly()
Dim sFileName = "MyApplicationName.JavaScript.js" 
Dim reader = New StreamReader(ass.GetManifestResourceStream(sFileName))
Dim sScriptText = reader.ReadToEnd()
reader.Close()

Onde MyApplicationName está o namespace do meu aplicativo. Não é o nome do assembly. Este nome é definido nas propriedades do projeto (guia Aplicativo).

Se você não encontrar o nome correto do recurso, poderá usar a GetManifestResourceNames()função

Dim resourceName() As String = ass.GetManifestResourceNames()

ou

Dim sName As String 
    = ass.GetManifestResourceNames()
        .Single(Function(x) x.EndsWith("JavaScript.js"))

ou

Dim sNameList 
    = ass.GetManifestResourceNames()
        .Where(Function(x As String) x.EndsWith(".js"))
schlebe
fonte
-1

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

Defina as variáveis ​​dinamicamente.

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

Chame uma tentativa de captura.

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 outro lugar, basta chamar outra função 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 foi alcançado foi um método para combinar vários arquivos txt e ler seus dados incorporados, dentro de uma única caixa de rich text. qual foi o efeito desejado com esse exemplo de código.

MasterCassidy
fonte