C# StreamWriter

Hallo,

ich schreibe gerade zu Übungszwecken ein Programm das die Collatzfunktion mit immer neuen zahlen durchrechnet und in eine Textdatei speichert.
Da die Textdatei schnell groß wird, wollte ich sie ab 250mb in einen Ordner verschieben. Das Funktioniert auch so weit, nur musste ich dafür den StreamWriter beenden, und jetzt kann ich ihn nicht öffnen.
Vielleicht hat jemand von euch eine Idee wie ich das machen könnte.

Hier noch der Quellcode:
long n = 1;
long i = 1;
int x = 1;
StreamWriter file = new StreamWriter(„H:\collatz.txt“);
FileInfo fileInfo = new FileInfo(„H:\collatz.txt“);

while (n != 1 || n >= 1)
{
if (n % 2 == 0)
{
n = n / 2;
file.WriteLine(n);
if (n == 1)
{
i = i + 1;
n = i;
file.WriteLine("*************************************************");
file.WriteLine("Start: " + n);
Console.WriteLine(n);
fileInfo.Refresh();
if (fileInfo.Length > 26214400)
{
file.Close(); //Da liegt das Problem
File.Move(„H:\collatz.txt“, „H:\collatz/collatz“ + x + „.txt“);
x++;
}
}
}
else
{
n = n * 3 + 1;
file.WriteLine(n);
}
}

Ich hoffe ihr könnte mir helfen, weil ich bin echt am Verzweifeln.

hey,

ich kann leider kein C#… aber ich würde schätzen, dass wenn du file.close() machst, dass du dann natürlich nicht mehr auf die datei zugreifen kannst. ein close ist normalerweise das letzte was du mit einer datei machst. Gibt es eine open() methode? ansonsten müsstest du einen neuen StreamWriter erstellen. denn die datei muss ja auch neu erstellt werden, da du die ja weggeschoben hast.

also das sind jetzt mal die gedanken von einen java entwickler :stuck_out_tongue:

viel glück… ansonsten ist stackoverflow für solche fragen eher geeignet

Hallo,

ist eigentlich doch ganz einfach.
Nach File.Move den StreamWriter wieder aufsetzen:
file = new StreamWriter(„D:\collatz.txt“, true);

Evtl. solltest du auch vor dem File.Move überprüfen, ob es den Ordner schon gibt oder noch erzeugt werden müsste. Es könnte auch die Datei schon vorher im Ordner vorhanden sein; da wäre ebenfalls eine Überprüfung nett (falls da, löschen bzw. umbenennen).
Die Strings, z.B. „H:\collatz.txt“ solltest du auch nur einmal im Code nennen und eine Variable dafür spendieren.

sollte in deinem Fall natürlich so lauten:

file = new StreamWriter("H:\\collatz.txt", true);

Hallo,

ich bin gerade in de Arbeit deswegen fällt die Antwort relativ kurz aus. Außerdem habe ich die API jetzt nicht auswendig im Kopf aber intuitiv:

sollte es nicht reichen wenn nach der Zeile mit
File.Move(…
wieder mit
file = new StreamWriter(„H:\collatz.txt“);

das File neu geöffnet wird?

MfG
Daniel

Hallo,

Streamwriter.Flush() ??? !!!

>

Also, ich denke, vordem File.Close(); sollst du noch File.Flush(); noch dazu setzen.

Wenn es noch nicht funktioniert, dann schicke mir ein’n Mail OK?

Gruß
Khanh Le

Hallo,

ich schätze auf den ersten Blick, dass es daran liegt, dass du die Datei verschiebst und anschließend versuchst, mit dem Writer wieder darauf zuzugreifen.

Hast du schon mal ausprobiert, nach dem file.Close den StreamWriter komplett zu zerstören und nach dem file.Move wieder mit new zu instanzieren?

Viele Grüße
René

verschiebe file.colse() an das ende

Vielen Dank für die Antwort, hat wunderbar funktioniert.

Kein Problem!

Gruß Markus

Sorry für die späte Antwort. Hast du das Probelm schon gelöst? Falls nein, nimm den StreamWriter in einen using-Block, dann sind anschliessend alle Ressourcen wieder freigegeben und das File.Move sollte funktionieren. Schreibe nochmals, wenn du dazu noch Hilfe brauchst.

Hallo Coldice4,

entschuldige für die späte Antwort,aber ich habe mal 2 Zeilen hinzugefügt…
Hier der Programmauszug:
if (fileInfo.Length > 26214400)
{
file.Close(); //Da liegt das Problem
File.Move(„D:\collatz.txt“, „D:\collatz/collatz“ + x + „.txt“);
file.Dispose(); // Dies gibt alle Ressourcen wieder frei
file = new StreamWriter(„D:\collatz.txt“); // hier einfach ein neues StreamWriter-Objekt erzeugen
x++;
}

Habe es kurz getestet und es lief scheinbat (nach der 3. Datei habe ich das Spielchen dann abgestellt :wink: )

Liebe Grüße

Tobias