web-dev-qa-db-fra.com

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

Je veux ajouter des lignes à mon dossier. 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 les unes en dessous des autres, mais je n'ai qu'une seule ligne, qui est écrasée à chaque fois que je lance ce code.

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

158
Waypoint

Utilisez ceci à la place:

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

Avec cette surcharge du constructeur StreamWriter, vous choisissez d’ajouter ou de remplacer le fichier.

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

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

Je suppose que vous exécutez tous du 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 écrasent ce qui était 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);
12
Jon

Essaye ça:

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

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.

7
Waqas

Utilisez ce constructeur StreamWriter avec le 2e paramètre - true.

5
Kirill Polishchuk

Une autre option utilise System.IO.File.AppendText

Ceci équivaut aux surcharges de StreamWriter données par d’autres.

De plus, File.AppendAllText peut donner une interface légèrement plus facile sans devoir s'inquiéter de l'ouverture et de la fermeture du flux. Vous devrez peut-être alors vous inquiéter de la création de vos propres sauts de ligne. :)

5
Chris

En fait, seule la réponse de Jon (5 septembre 11 à 9:37) avec BaseStream.Seek a fonctionné pour mon cas. Merci Jon! J'avais besoin de ajouter lignes à un fichier txt archivé 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");
        }
    }
}
4
Veroslav Olic

Une méthode plus simple consiste à utiliser le File.AppendText qui ajoute du texte codé UTF-8 à un fichier existant ou à un nouveau fichier si le fichier spécifié n'existe pas et renvoie un System.IO.StreamWriter

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

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");
1
Shahaf