StreamWriter nicht schreiben Sie eine Datei, die nicht existiert
Ich mache ein level-editor für mein Spiel, und die meisten arbeiten, außer...
Wenn ich versuche zu speichern meiner Datei (XML) die Datei nicht erstellt, und im Feld Ausgabe bekomme ich:
A first chance exception of type 'System.NullReferenceException'
Das lustige an der Sache ist, dass es nur passiert, wenn die Datei nicht existiert, aber es funktioniert, wenn ich eine andere Datei überschreiben.
hier ist der code, den ich verwende:
using (StreamWriter stream = new StreamWriter(filePath))
{
stream.Write(data);
stream.Close();
}
Daten ist ein string (das ist nicht das problem, weil es funktioniert, wenn ich die Datei überschreiben)
Die Linie gibt die
Es nicht sagen, ich denke die StreamWriter muss die Ausnahme abzufangen und zu Debuggen.WriteLine " die Nachricht
Das einzige was ich mir vorstellen kann ist, dass das Programm nicht haben, erstellen Sie Berechtigungen für das Verzeichnis. Versuchen Sie, die
nee, die Ausnahme ist noch nicht erschienen, es ist nur geschrieben, um die Ausgabe-box
ja, Sie funktionieren, wenn die Datei vorhanden ist
NullReferenceException
?Es nicht sagen, ich denke die StreamWriter muss die Ausnahme abzufangen und zu Debuggen.WriteLine " die Nachricht
Das einzige was ich mir vorstellen kann ist, dass das Programm nicht haben, erstellen Sie Berechtigungen für das Verzeichnis. Versuchen Sie, die
using
(nur zum Debuggen) und sehen, ob man eine sinnvolle Ausnahme.nee, die Ausnahme ist noch nicht erschienen, es ist nur geschrieben, um die Ausgabe-box
ja, Sie funktionieren, wenn die Datei vorhanden ist
InformationsquelleAutor annonymously | 2012-01-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist fehlt ein Konstruktor das dauert ein boolescher Wert, der kann Hilfe bei der Erstellung der Datei:
Die Logik ist tatsächlich etwas komplizierter als das, aber:
Wenn die Datei vorhanden ist, ich diese überschreiben wollen, nicht daran anfügen
Ich glaube nicht, dass dies der richtige überlastung. Das problem ist nicht, dass die Datei immer überschrieben werden, sondern, dass es nicht immer in Erster Linie erstellt.
Ich habe einen Blick und mit
append
wirdfalse
dieser Konstruktor wird immer die Datei erstellt wenn Sie nicht existiert. Als pro dieser: Initialisiert eine neue Instanz der StreamWriter-Klasse für die angegebene Datei auf dem angegebenen Pfad, mit dem default-encoding und den Puffer. Wenn die Datei vorhanden ist, kann es entweder überschrieben oder angehängt. Wenn die Datei nicht existiert, wird dieser Konstruktor erzeugt eine neue Datei.Bei der Verwendung der
using
Schlüsselwort, brauchen Sie nicht zu nennensw.Close()
es automatisch erledigt. (das ist der springende Punkt, der mitusing
in den ersten Platz)InformationsquelleAutor Grant Thomas
Warum nicht Sie nur gehen, um es den einfachen Weg, und prüfen Sie die Datei-Existenz vor zu schreiben:
Ich würde es wirklich nicht machen es komplizierter als die persönlich. Auch, schließen Sie nicht die
StreamWriter
, dieusing
Anweisung verfügt, der es, nachdem es seinen Zweck erfüllt.Ich persönlich glaube nicht, dass es funktioniert. Auch wenn es redundant ist, es macht es einfacher zu Lesen, zu verstehen und zu Debuggen.
Es ist nicht leichter zu Lesen. Dieser code sagt über race conditions? Was ist, wenn andere Prozess löscht die Datei, nachdem es erstellt wurde? Es Fehler-anfällig für race conditions. StreamWriter hat korrekt zu erstellen der Datei. Ansonsten ist es ein bug .NET.
InformationsquelleAutor aevitas
In meinem Fall war ich laufen, das Programm als nicht-admin war, war die Datei geschrieben werden, in einem Ordner, der erstellt wurde, mit administrator-Rechte vorhanden (auch im ProgramFiles oder einem nicht-admin-Lage). Die Datei wird nie erstellt, und Sie müssen Sie manuell aktivieren die
Managed Debugging Assistants
Ausnahme der Pausen, um zu sehen, keine Fehler.Lösung war den Ordner zu löschen und erstellen Sie ihn erneut mit meinem nicht-admin-Konto. Beachten Sie auch, dass StreamWriter nicht erstellen Verzeichnisse, nur Dateien.
InformationsquelleAutor Sergio Basurco
Haben Sie versucht, nicht mit Datei.Create()? etwa so:
Wenn ich diesen code ausführen es wird eine Datei erstellt wenn Sie nicht existiert. Und überschreibt es gibt Sie, ist, dass nicht das Verhalten, das Sie wollte?
Ok, ich sehe, dies ist die Art, wie er sich Verhalten sollte, aber es funktioniert nicht auf Ihrem bestimmten computer. Kann man einen stack-trace? Haben Sie versucht, um zu sehen, ob Sie die neueste version von der .NET framework? Vielleicht irgendwie muß man schreiben, aber nicht die Berechtigung "erstellen", um den Ordner?
Ich habe die neueste .net framework, und ich bin mir ziemlich sicher, dass ich die create-Berechtigungen für den Ordner. Da für den stack-trace, tut mir Leid, aber ich kann nicht scheinen, um zu Debuggen, nachdem der Fehler, es ist nur setzt das Programm
Sie können versuchen, die Kostenlose filemon Anwendung, um zu sehen, ob es gibt Ihnen mehr details. Es gibt auch eine Einstellung in visual studio, wird das einfrieren der Anwendung, wenn eine Ausnahme ausgelöst wird, auch verarbeitet diejenigen. Schließlich können Sie code hinzufügen, um die Ausgabe der stack-trace.
InformationsquelleAutor Luis Perez