Ajouter une seule ligne en haut du fichier texte

Mon application extrait les données et les ajoute à un fichier texte, mais je dois savoir comment consulter par programme la première ligne du fichier et voir si elle correspond au texte suivant:

DateTime, VirtualIP, VirtualPort, VirtualName, DestinationIP, DestPort, Status, Desired

Si c’est le cas, continuez à utiliser la fonction normale (extrait ci-dessous), si la première ligne n’est pas identique à celle ci-dessus, alors je souhaite insérer ce qui précède dans la première ligne sans écraser ce qui y est actuellement. Comment puis-je faire ceci? (essentiellement en insérant tout ce qui se passe sur une ligne pour que je puisse append ce que je veux sur la première ligne) … btw, cela est enregistré sous un fichier CSV pouvant être ouvert dans Excel.

try { // ... for (int j = 0; j < memberStatus.Result.Count; j++) { VirtualMemberStatus status = memberStatus.Result[j]; //text += String.Format("Name: {4}, Member: {0}:{1}, Status: {2}, Desired: {3}" + Environment.NewLine, status.Member.Address, status.Member.Port, status.EffectiveStatus, status.DesiredStatus, virtualKey.Key); text += String.Format("{5},{4},{0},{1},{2},{3}" + Environment.NewLine, status.Member.Address, status.Member.Port, status.EffectiveStatus, status.DesiredStatus, virtualKey.Key.Replace(":", ","), DateTime.UtcNow); } } catch { //ERROR CODE 2 //MessageBox.Show("Error occurred, check device name (case senstive) and admin group. This error may also occur due to connection loss, try again."); errors += String.Format("{0} Error Code: 2, Error occurred, check device name (case senstive) and admin group. This error may also occur due to connection loss, try again." + Environment.NewLine, DateTime.UtcNow); } this.resultsTextBox.Text = text; 

Ce fichier n’est pas beaucoup supprimé, mais dans le cas contraire, je souhaite que les noms de colonne corrects figurent en haut. c’est à dire:

 DateTime,VirtualIP,VirtualPort,VirtualName,DestinationIP,DestPort,Status,Desired 

Vous devez réécrire le fichier entier.

  1. ouvrir un nouveau fichier (temporaire!)
  2. écrire la ligne d’en-tête
  3. pour chaque ligne d’entrée, écrivez une ligne (envisagez la mise en mémoire tampon de bloc si les performances sont un problème)
  4. purger et fermer le fichier de sortie
  5. UNIQUEMENT s’il n’y a pas d’erreur, déplacez le fichier temporaire sur place (en le renommant).

Cette procédure peut éviter des problèmes en cas d’erreur (IO) au milieu du processus.

Voici le code pour faire une telle chose:

 using (var input = new StreamReader("input.txt")) using (var output = new StreamWriter("input.txt.temp")) { output.WriteLine("headerline"); // replace with your header :) var buf = new char[4096]; int read = 0; do { read = input.ReadBlock(buf, 0, buf.Length); output.Write(buf, 0, read); } while (read > 0); output.Flush(); output.Close(); input.Close(); } File.Replace("input.txt.temp", "input.txt", "input.txt.backup"); 

Notez que l’exemple de code crée même une sauvegarde. Une amélioration possible consisterait à instancier explicitement FileStream(...., FileMode.CreateNew) afin d’empêcher le remplacement du fichier temporaire si un fichier existe déjà sous ce nom.

Une autre solution consiste à utiliser System.IO.Path.GetTempFileName() . Cependant, File.Replace pourrait ne plus être efficace et atomique, car le dossier temporaire pourrait se trouver sur un autre volume / système de fichiers.

vous avez besoin de chercher en première position pour voir si elle mathèse ces mots, cet extrait de code peut réaliser ce que vous recherchez.

  Dim filePath As Ssortingng = "file.txt" Dim bufferSize As Integer = 8129 Dim textToMatch As Ssortingng = "DateTime,VirtualIP,VirtualPort,VirtualName,DestinationIP,DestPort,Status,Desired" Dim textByte As Byte() = ASCIIEncoding.ASCII.GetBytes(text) Dim buffer As Byte() = Nothing Dim fs As FileStream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite) fs.Read(buffer, 0, bufferSize) Dim i As Int32 = fs.Seek(0, SeekOrigin.Begin) fs.Position = i If fs.Position.Equals(textToMatch) Then Else fs.Write(textByte, 0, textByte.Length) End If fs.Flush() fs.Close()