Como ler vários arquivos de texto e salvá-los em um arquivo de texto?

votos
1

No meu caso eu tenho cinco arquivos de texto enormes, que eu tenho que embedd em um arquivo de texto.

Eu tentei com StreamReader (), mas eu não sei como fazê-lo Leia mais um arquivo, eu tenho que atribuir outra variável?

Que mostra um exemplo será apreciado greatfully.

Publicado 19/05/2009 em 21:36
fonte usuário
Em outras línguas...                            


2 respostas

votos
8

nova resposta

(Veja explicação para junking resposta original abaixo).

static void CopyFiles(string dest, params string[] sources)
{
    using (TextWriter writer = File.CreateText(dest))
    {
        // Somewhat arbitrary limit, but it won't go on the large object heap
        char[] buffer = new char[16 * 1024]; 
        foreach (string source in sources)
        {
            using (TextReader reader = File.OpenText(source))
            {
                int charsRead;
                while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0)
                {
                    writer.Write(buffer, 0, charsRead);
                }
            }
        }
    }
}

Esta nova resposta é completamente como a abordagem de Martin, exceto:

  • Lê-se para um tampão de menor; 16K vai ser aceitável em quase todas as situações, e não vai acabar na pilha de objeto grande (que não fica compactado)
  • Ele lê texto de dados em vez de binários de dados, por duas razões:
    • O código pode ser facilmente modificado para converter de uma codificação para outra
    • Se cada arquivo de entrada contém uma marca de ordem de byte, que será ignorado pelo leitor, em vez de acabar com marcas de ordem de byte espalhados através do arquivo de saída em limites de arquivo de entrada

resposta original

Martin Stettner apontou um problema na resposta abaixo - se o primeiro arquivo termina sem uma nova linha, ainda vai criar uma nova linha no arquivo de saída. Além disso, ele irá traduzir novas linhas para o "\ r \ n", mesmo que anteriormente eram apenas "\ r" ou "\ n". Finalmente, inutilmente riscos usando grandes quantidades de dados para linhas longas.

Algo como:

static void CopyFiles(string dest, params string[] sources)
{
    using (TextWriter writer = File.CreateText(dest))
    {
        foreach (string source in sources)
        {
            using (TextReader reader = File.OpenText(source))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    writer.WriteLine(line);
                }
            }
        }
    }
}

Note que este lê linha por linha para evitar lendo muito na memória de cada vez. Você poderia torná-lo mais simples se você está feliz ao ler cada arquivo completamente na memória (ainda um de cada vez):

static void CopyFiles(string dest, params string[] sources)
{
    using (TextWriter writer = File.CreateText(dest))
    {
        foreach (string source in sources)
        {
            string text = File.ReadAllText(source);
            writer.Write(text);
        }
    }
}
Respondeu 19/05/2009 em 21:42
fonte usuário

votos
2

Editar :

Como Jon Skeet apontou, arquivos de texto normalmente deve ser tratado de forma diferente do que os arquivos binários.

Eu só deixar esta resposta, uma vez que pode ser mais performance se você tem realmente grandes arquivos e não são concernded através da codificação de questões (como diferentes arquivos de entrada com diferentes codificações ou múltipla Byte Order marcas no arquivo de saída):

public void CopyFiles(string destPath, string[] sourcePaths) {
  byte[] buffer = new byte[10 * 1024 * 1024]; // Just allocate a buffer as big as you can afford
  using (var destStream= = new FileStream(destPath, FileMode.Create) {
    foreach (var sourcePath in sourcePaths) {
      int read;
      using (var sourceStream = FileStream.Create(sourcePath, FileMode.Open) {
        while ((read = sourceStream.Read(buffer, 0, 10*1024*1024)) != 0)
          destStream.Write(buffer, 0, read);
      }
    }
  }
}
Respondeu 19/05/2009 em 23:18
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more