2011-09-05 4 views
128

Je souhaite ajouter des lignes à mon fichier. J'utilise un StreamWriter:Ajout de lignes à un fichier à l'aide d'un StreamWriter

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

La sortie de mon fichier doit être plusieurs chaînes ci-dessous les uns des autres, mais je ne dispose que d'une ligne, qui est écrasé à chaque fois que je lance ce code.

Y a-t-il un moyen de laisser l'ajout de StreamWriter à un fichier existant?

+15

Ne pas oublier de jeter 'StreamWriter'. Un bloc 'using' est une meilleure syntaxe pour cela. – TheCodeKing

+1

C'est aussi pourquoi je préfère ne pas me soucier des flux lors de mises à jour très rapides d'un fichier en utilisant File.AppendAllText - http://msdn.microsoft.com/en-us/library/ms143356.aspx – Chris

+0

@TheCodeKing - Can vous me montrez du code pour le faire? – Steam

Répondre

213

Utilisez ce lieu:

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

Avec cette surcharge du constructeur StreamWriter que vous choisissez si vous ajoutez le fichier ou le remplacer.

C# 4 et offre au-dessus de la syntaxe suivante, que certains trouvent plus lisible:

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

Remplacer ceci:

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

avec ceci:

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

true indique que ajoute du texte.

129
using (FileStream fs = new FileStream(fileName,FileMode.Append, FileAccess.Write)) 
using (StreamWriter sw = new StreamWriter(fs)) 
{ 
    sw.WriteLine(something); 
} 
8

Essayez ceci:

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

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 finissent par écraser ce qui existait auparavant.

Vous pouvez résoudre le problème de deux façons: soit avec la pratique

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

ou en repositionnant explicitement le flux vous pointeur:

file2 = new StreamWriter("c:/file.txt"); 
file2.BaseStream.Seek(0, SeekOrigin.End); 
+0

Et si le fichier a 10mb et que je commence à écrire à partir de la position 0, mais seulement 10kb, comment puis-je m'assurer que le fichier * only * contient les données 10kb que je viens d'écrire? – JobaDiniz

5

Une autre option utilise System.IO.File.AppendText

Cette est équivalent aux surcharges de StreamWriter que d'autres ont donné.

Aussi File.AppendAllText peut donner une interface légèrement plus facile sans avoir à s'inquiéter de l'ouverture et la fermeture du flux. Bien que vous ayez à vous soucier de mettre vos propres sauts de ligne. :)

4

En fait, seule la réponse de Jon (5 Sep 11 à 09:37) avec BaseStream.Seek a fonctionné pour mon cas. Merci Jon! Je devais 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"); 
     } 
    } 
} 
1

Remplacez cette ligne:

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

avec ce code:

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

puis écrire votre ligne au fichier texte comme celui-ci:

sw.WriteLine("text content"); 
2

One more manière simple utilise le File.AppendText il ajoute UTF-8 texte codé à un fichier existant ou dans 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"); 
}