2009-07-20 8 views
0

Ich verwende das StreamWriter-Objekt, um entweder in eine Datei zu schreiben, die vom Konstruktor erstellt wird oder bereits vorhanden ist. Wenn die Datei existiert, hängt sie Daten an. Wenn nicht, sollte es eine Datei erstellen und dann auch Daten anhängen. Das Problem besteht darin, dass der StreamWriter-Konstruktor beim Erstellen der Datei die Datei erstellt, jedoch keine Daten in die Datei schreibt.StreamWriter - An erstellte Datei nicht angehängt

bool fileExists = File.Exists(filePath); 

using (StreamWriter writer = new StreamWriter(filePath, true)) 
{ 
    if (!fileExists) 
    { 
     writer.WriteLine("start"); 
    } 

    writer.WriteLine("data"); 
} 

EDIT: Danke für die Antworten. Der using-Block sorgt dafür, dass der Writer geschlossen wird. Was andere Leute sagen, es funktioniert für sie, gibt es irgendwelche Informationen, die ich Ihnen geben kann, um das Problem weiter zu diagnostizieren? Die Datei ist über ein Netzwerk verteilt. Könnte das ein potenzielles Problem sein? Intermittierend erhalte ich die Fehler "Ich konnte keinen Teil des Pfades finden ..." und "Der angegebene Netzwerkname ist nicht mehr verfügbar."

+0

Funktioniert für mich. - – weiqure

+0

Ihr Code funktioniert einwandfrei auf meinem Rechner. –

+0

Funktioniert auch für mich ... @Dan, versuch es nochmal und check, vielleicht hast du beim ersten Lauf etwas verpasst? Die using-Anweisung sollte sich um das Schließen und Spülen kümmern ... –

Antwort

1

Okay, so Ich habe es herausgefunden. Mein lokaler Computer hatte Probleme beim zeitweiligen Zugriff auf die Datei über das Netzwerk. Ich habe den Code auf den Server hochgeladen und lief dort ohne Probleme. Ich schätze wirklich all die Hilfe. Es tut mir leid, dass die Lösung nicht sehr aufregend war.

0

Ihr Code funktioniert für mich, nach 3 Läufen Ich habe:

 
start 
data 
data 
data 

Bist Du sicher, dass Ihre nicht-Access-Datei versucht, dass aus irgendeinem Grund Sie nicht, um es schreiben? Auch, nur um sicherzustellen, platzieren Sie writer.Close() vor der Entsorgung, obwohl Dispose() sollte die Daten zu löschen. Wenn dies nicht hilft, versuchen Sie, die Datei manuell mit File.Create() mit entsprechenden Flags zu erstellen.

// Edit: Ich habe diesen Code versucht, auf meinem Rechner:

 
public unsafe static void Main() 
{ 
    string filePath = @"\\COMP-NAME\Documents\foo.txt"; 
    FileStream fs = null; 
    if (!File.Exists(filePath)) 
     fs = File.Create(filePath); 
    else 
     fs = File.Open(filePath, FileMode.Append); 

    using (StreamWriter writer = new StreamWriter(fs)) 
    { 
     writer.WriteLine("data"); 
    } 
} 

Und es reibungslos läuft, könnte dies ein Versuch?

+0

Das war meine erste Reaktion. Ich habe versucht, die Datei zu erstellen, wenn es nicht existierte und nur den obigen Code verwendet, aber das würde auch beim ersten Aufruf schreiben. Gibt es Latenzprobleme beim Erstellen einer Datei auf einem Server auf diese Weise? –

+0

Ich habe Code, den ich gekocht habe, überprüft, um zu prüfen, ob dies über das Netzwerk funktioniert, unter Abschnitt Bearbeiten. Behandle es nicht als Produktionscode, weil es nicht zu 100% korrekt ist, diese Zeit zu verwenden, aber es funktioniert für mich, es setzt Daten beim Erstellen von Dateien und dann an die ID. –

0

Ihr Code richtig für mich gearbeitet ..

Versuchen Sie, eine Anweisung using

using (StreamWriter writer = new StreamWriter(filePath, true)) 
{ 
    if (!fileExists) 
    { 
     writer.WriteLine("start"); 
    } 

    writer.WriteLine("data"); 
    writer.Flush(); 
} 
+2

Der Autor verwendet 'using' Anweisung? –

+0

Wenn Sie sich den Beispielcode ansehen, verwende ich eine using-Anweisung? –

1

Der Code auf meinem Computer fein lief. Können wir wissen, was die Variable filePath enthält? Vielleicht haben Sie sich die falsche Datei angesehen ...

UPDATE: Netzwerkproblem? Vielleicht hat jemand etwas auf der anderen Seite des Netzwerks gemacht. Versuchen Sie, in eine lokale Datei zu schreiben. Wenn es funktioniert, versuchen Sie, in eine Remote-Datei an einem anderen Ort zu schreiben.

+1

Zeichenfolge filePath = @ "\\ Server \ Ordner \ Dateiname.htm"; Es funktioniert bei nachfolgenden Aufrufen, nachdem die Datei erstellt wurde, damit ich weiß, dass es der richtige Pfad ist. –

+0

Basierend auf den intermittierenden Fehlermeldungen, die Sie angegeben haben, könnte der Server selbst beschäftigt/offline sein. Oder der Ordner selbst wurde gelöscht und Sie sind nicht berechtigt, den Ordner zu erstellen (oder den Ordner nicht erstellt zu haben). Ein Datei/Ordner-Erlaubnisproblem vielleicht? –

0

Könnte versuchen, die File.Open Funktion. Es gibt ein gutes Beispiel an der Unterseite und Liste der FileModes FileMode.Append ist, was Sie wollen

0

Ähnlich wie andere, die gepostet haben, funktioniert Ihr Code gut auf meinem PC.

Es könnte helfen, für Sie den Code in zwei Teile zu brechen, wobei der erste Teil den Header zu schreiben, wenn die Datei nicht bereits vorhanden ist, dann den zweiten Teil der Daten zu schreiben:

try 
{ 
    using (FileStream fs = new FileStream(filePath, FileMode.CreateNew)) 
    { 
     using (StreamWriter sw = new StreamWriter(fs)) 
     { 
      sw.WriteLine("start"); 
     } 
    } 
} 
catch (IOException ex) 
{ 
} 

using (StreamWriter writer = new StreamWriter(filePath, true)) 
{ 
    writer.WriteLine("data"); 
} 
Verwandte Themen