Ajouter des lignes à un fichier à l'aide d'un StreamWriter

170

Je souhaite ajouter des lignes à mon fichier. J'utilise un StreamWriter:

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

La sortie de mon fichier doit être plusieurs chaînes en dessous les unes des autres, mais je n'ai qu'une seule ligne, qui est écrasée chaque fois que j'exécute ce code.

Existe-t-il un moyen de laisser le StreamWriter s'ajouter à un fichier existant?

Waypoint
la source
19
N'oubliez pas de vous débarrasser StreamWriter. Un usingbloc est une meilleure syntaxe pour cela.
TheCodeKing
1
C'est aussi pourquoi je préfère ne pas m'inquiéter des flux lorsque je fais des mises à jour très rapides d'un fichier en utilisant File.AppendAllText - msdn.microsoft.com/en-us/library/ms143356.aspx
Chris
@TheCodeKing - Pouvez-vous me montrer du code pour faire ça?
Steam du
4
@blastousing (var stream = new StreamWriter(..)) { stream.WriteLine(..); }
TheCodeKing

Réponses:

279

Utilisez plutôt ceci:

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

Avec cette surcharge du constructeur StreamWriter, vous choisissez si vous ajoutez ou écrasez le fichier.

C # 4 et supérieur offre la syntaxe suivante, que certains trouvent plus lisible:

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

Je suppose que vous exécutez tout le code ci-dessus chaque fois que vous écrivez quelque chose dans le fichier. Chaque fois que le flux du fichier est ouvert, son pointeur de recherche est positionné au début de sorte que toutes les écritures finissent par écraser ce qui existait auparavant.

Vous pouvez résoudre le problème de deux manières: soit avec le

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

ou en repositionnant explicitement le pointeur de flux vous-même:

file2 = new StreamWriter("c:/file.txt");
file2.BaseStream.Seek(0, SeekOrigin.End);
Jon
la source
Que faire si le fichier a 10 Mo et que je commence à écrire à partir de la position 0, mais seulement 10 Ko, comment puis-je m'assurer que le fichier ne contient que les données de 10 Ko que je viens d'écrire?
JobaDiniz
10

Essaye ça:

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

Remplacez ceci:

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

avec ça:

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

true indique qu'il ajoute du texte.

Waqas
la source
5

Une autre option consiste à utiliser System.IO.File.AppendText

Cela équivaut aux surcharges StreamWriter que d'autres ont données.

Aussi File.AppendAllText peut donner une interface un peu plus facile , sans avoir à se soucier d' ouverture et de fermeture du flux. Cependant, vous devrez peut-être vous soucier de mettre vos propres sauts de ligne. :)

Chris
la source
5

En fait, seule la réponse de Jon (5 septembre 2011 à 9h37) avec BaseStream.Seek a fonctionné pour mon cas. Merci Jon! J'avais besoin d' ajouter des lignes à un fichier txt archivé par zip.

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

la source
3

Un autre moyen simple consiste à utiliser le File.AppendTextil ajoute du texte encodé UTF-8 à un fichier existant, ou à un nouveau fichier si le fichier spécifié n'existe pas et renvoie unSystem.IO.StreamWriter

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

Remplacez cette ligne:

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

avec ce code:

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

puis écrivez votre ligne dans le fichier texte comme ceci:

sw.WriteLine("text content");
Shahaf
la source