Anexar linhas a um arquivo usando um StreamWriter

170

Quero anexar linhas ao meu arquivo. Estou usando um StreamWriter:

StreamWriter file2 = new StreamWriter(@"c:\file.txt");
file2.WriteLine(someString);
file2.Close();

A saída do meu arquivo deve estar várias strings uma abaixo da outra, mas eu tenho apenas uma linha, que é substituída toda vez que executo esse código.

Existe alguma maneira de deixar o StreamWriter anexar a um arquivo existente?

Parada
fonte
19
Não se esqueça de descartar StreamWriter. Um usingbloco é melhor sintaxe para isso.
TheCodeKing 5/09/11
1
É também por isso prefiro não se preocupar com correntes ao fazer atualizações muito rápidas para um arquivo usando File.AppendAllText - msdn.microsoft.com/en-us/library/ms143356.aspx
Chris
@TheCodeKing - Você pode me mostrar algum código para fazer isso?
Steam
4
@blastousing (var stream = new StreamWriter(..)) { stream.WriteLine(..); }
TheCodeKing

Respostas:

279

Use isso:

new StreamWriter("c:\\file.txt", true);

Com essa sobrecarga do construtor StreamWriter, você escolhe se anexa ou sobrescreve o arquivo.

O C # 4 e acima oferecem a seguinte sintaxe, que alguns acham mais legível:

new StreamWriter("c:\\file.txt", append: true);
Øyvind Bråthen
fonte
145
 using (FileStream fs = new FileStream(fileName,FileMode.Append, FileAccess.Write))
 using (StreamWriter sw = new StreamWriter(fs))
 {
    sw.WriteLine(something);
 }
Andrey Taptunov
fonte
13

Eu suponho que você esteja executando tudo o código acima sempre que escrever algo no arquivo. Cada vez que o fluxo do arquivo é aberto, seu ponteiro de busca é posicionado no início, para que todas as gravações substituam o que havia antes.

Você pode resolver o problema de duas maneiras: com o conveniente

file2 = new StreamWriter("c:/file.txt", true);

ou reposicionando explicitamente o ponteiro do fluxo:

file2 = new StreamWriter("c:/file.txt");
file2.BaseStream.Seek(0, SeekOrigin.End);
Jon
fonte
e se o arquivo tiver 10mb e eu começar a escrever na posição 0, mas apenas 10kb, como posso garantir que o arquivo contenha apenas os dados de 10kb que acabei de escrever?
JobaDiniz
10

Tente o seguinte:

StreamWriter file2 = new StreamWriter(@"c:\file.txt", true);
file2.WriteLine(someString);
file2.Close();
Marco
fonte
7

Substitua isto:

StreamWriter file2 = new StreamWriter("c:/file.txt");

com isso:

StreamWriter file2 = new StreamWriter("c:/file.txt", true);

true indica que ele anexa texto.

Waqas
fonte
5

Outra opção é usar System.IO.File.AppendText

Isso é equivalente às sobrecargas do StreamWriter que outras pessoas forneceram.

Além disso, File.AppendAllText pode fornecer uma interface um pouco mais fácil sem precisar se preocupar em abrir e fechar o fluxo. Embora você possa precisar se preocupar em criar suas próprias quebras de linha. :)

Chris
fonte
5

Na verdade, apenas a resposta de Jon (5 de setembro de 2011 às 9:37) com BaseStream.Seek funcionou para o meu caso. Obrigado Jon! Eu precisava anexar linhas a um arquivo txt zipado.

using (FileStream zipFS = new FileStream(@"c:\Temp\SFImport\test.zip",FileMode.OpenOrCreate))
{
    using (ZipArchive arch = new ZipArchive(zipFS,ZipArchiveMode.Update))
    {
        ZipArchiveEntry entry = arch.GetEntry("testfile.txt");
        if (entry == null)
        {
            entry = arch.CreateEntry("testfile.txt");
        }
        using (StreamWriter sw = new StreamWriter(entry.Open()))
        {
            sw.BaseStream.Seek(0,SeekOrigin.End);
            sw.WriteLine("text content");
        }
    }
}

fonte
3

Uma maneira mais simples é usar o File.AppendTexttexto anexado em UTF-8 a um arquivo existente ou a um novo arquivo se o arquivo especificado não existir e retornar umSystem.IO.StreamWriter

using (System.IO.StreamWriter sw = System.IO.File.AppendText(logFilePath + "log.txt"))
{                                                
    sw.WriteLine("this is a log");
}
Vinod Srivastav
fonte
1

Substitua esta linha:

StreamWriter sw = new StreamWriter("c:/file.txt");

com este código:

StreamWriter sw = File.AppendText("c:/file.txt");

e escreva sua linha no arquivo de texto como este:

sw.WriteLine("text content");
Shahaf
fonte