2016-04-04 9 views
0

Meine Klasse, die den Konstruktor des Schreibens zu einerC# Text Writer schreibt am Anfang der Datei

class Writer 
    { 
     public Writer(string filename, List<string> data) 
     { 
      FileStream ostrm; 
      StreamWriter writer; 
      TextWriter oldOut = Console.Out; 
      try 
      { 
       ostrm = new FileStream("C:/Users/kyle/Desktop/ConferenceSoftware/" + filename + ".txt", FileMode.OpenOrCreate, FileAccess.Write); 
       writer = new StreamWriter(ostrm); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Cannot open " + filename + ".txt for writing"); 
       Console.WriteLine(e.Message); 
       return; 
      } 


Console.SetOut(writer); 
      foreach (var _data in data) 
      { 
       Console.WriteLine(_data); 
      } 
      Console.SetOut(oldOut); 
      writer.Close(); 
      ostrm.Close(); 
     } 
    } 

In meiner Hauptmethode Datei enthält:

List<string> dataToAdd = new List<string>(); 
dataToAdd.Add("Example"); 
new Writer(Settings.ConferenceRoomName, dataToAdd); 

Allerdings, wenn ich bereits Text in der Datei, anstatt auf die Datei von der letzten Zeile angehängt, tut sie es von der ersten Zeile, das heißt:

Example // new added through method 
Line that already exists // already in file 
Line that already exists // already in file 
// this is where I wanted it but it goes to the top 

Eine Ich helfe Ihnen gerne, ich sehe nicht, wo ich die Zeile ausrichten könnte, um mit dem Schreiben zu beginnen.

Vielen Dank im Voraus.

Antwort

3

Sie müssen FileMode.Append verwenden statt OpenOrCreate:

ostrm = new FileStream("C:/Users/kyle/Desktop/ConferenceSoftware/" + 
        filename + ".txt", FileMode.Append, FileAccess.Write); 

Siehe MSDN (ca. FileMode.Append):

Öffnet die Datei, wenn es vorhanden ist, und möchte das Ende der Datei oder erstellt eine neue Datei. Dies erfordert die Berechtigung FileIOPermissionAccess.Append. FileMode.Append kann nur in Verbindung mit FileAccess.Write ... verwendet werden.

So wird es auch die Datei erstellen, wenn es nicht existiert.
Wenn Sie keine nicht existierende Datei erstellen möchten, können Sie vor dem Öffnen des Streams überprüfen, ob sie existiert, indem Sie File.Exists() verwenden.

+0

Schlage den Nagel auf den Kopf, funktioniert wie ein Zauber und ich brauche mir keine Gedanken über das Erstellen von Dateien zu machen. Danke dafür - ich werde es so bald wie möglich markieren! :) – KDOT

3

Wenn Sie eine neue FileStream mit FileMode.OpenOrCreate erstellen, schreibt es über die vorhandene Datei. Wenn Sie auf die Datei anhängen möchten, verwenden Sie FileMode.Append statt:

FileMode.Append: die Datei öffnet, wenn es vorhanden ist, und sucht bis zum Ende der Datei, oder eine neue Datei erstellt. Dies erfordert FileIOPermissionAccess.Append Erlaubnis.

ostrm = new FileStream("C:/Users/kyle/Desktop/ConferenceSoftware/" + filename + ".txt", FileMode.Append, FileAccess.Write); 
+0

könnte ich möglicherweise eine switch-Anweisung auf check-Datei vorhanden oder ein Versuch catch je nachdem, ob ich eine neue erstellen oder anhängen? weil ich in einigen Fällen eine Datei erstellen möchte, danke dafür! – KDOT

+1

@ KyleE4K Sie können 'ostrm.Position' nach dem Öffnen überprüfen. Wenn es Null ist, haben Sie gerade eine neue Datei erstellt oder die alte war leer. Andernfalls hängen Sie an. – dasblinkenlight

+1

@ KyleE4K können Sie 'File.Exists (...)' verwenden, um vor dem Erstellen zu prüfen, ob es existiert. –

1

Sie wollen Dateimodus Append statt OpenOrCreate:

ostrm = new FileStream("C:/Users/kyle/Desktop/ConferenceSoftware/" + filename + ".txt", FileMode.Append, FileAccess.Write); 

Beide werden eine neue Datei erstellen, wenn es nicht vorhanden ist, ist der Unterschied besteht darin, dass OpenOrCreate beginnt am Anfang des Schreibens Datei und Append beginnt am Ende der Datei zu schreiben.

Referenz: FileMode Enumeration

Verwandte Themen