hallo ich habe ein Programm geschrieben welches mri den inhalt einer string in einen .txt datei ausgeben soll. es hat auch alles super funkttioniert. ich habe ein wenig weiter programiert und jetzt bekomme ich immer diese Fehlermeldung.
wen das programmm folgendes an die funktion weitergeibt:
//Schreiben Templog
c_textdatei.WriteLine(@"C:\Users\Joshua\SSD\EinsatzLog.txt", 1, strNachricht, true);
progressBar2.Value = 50;
funktion:
public void WriteLine(String sFilename, int iLine, string sLines, bool bReplace)
{
string sContent = "";
string[] delimiterstring = { "\r\n" };
if (File.Exists(sFilename))
{
StreamReader myFile = new StreamReader(sFilename, System.Text.Encoding.Default);
sContent = myFile.ReadToEnd();
myFile.Close();
}
string[] sCols = sContent.Split(delimiterstring, StringSplitOptions.None);
if (sCols.Length >= iLine)
{
if (!bReplace)
sCols[iLine - 1] = sLines + "\r\n" + sCols[iLine - 1];
else
sCols[iLine - 1] = sLines;
sContent = "";
for (int x = 0; x < sCols.Length - 1; x++)
{
sContent += sCols[x] + "\r\n";
}
sContent += sCols[sCols.Length - 1];
}
else
{
for (int x = 0; x < iLine - sCols.Length; x++)
sContent += "\r\n";
sContent += sLines;
}
StreamWriter mySaveFile = new StreamWriter(sFilename);
mySaveFile.Write(sContent);
mySaveFile.Close();
}
}
die fehlermeldung
System.OutOfMemoryException
ich hoffe ihr könnt ihr helfen und sagen was sich nur falsch mach! vielen dank schon mal im voraus!
Wie groß ist denn Datei?
Wo genau kommt den die Fehlermeldung?
Hallo alab94,
was genau willst du mit dem Code machen? Der sieht irgendwie sehr ungeordnet und schlimm aus.
Wenn du einfach einen Text am Ende der Datei anhängen willst dann kannst du auch File.AppendAllText oder ähnliches verwenden.
Dann musst du nicht vorher selbst alles einlesen. Und dann die Zeile einfügen.
Das Problem mit der OutOfMemoryException wird vermutlich von einer deiner Schleifen ausgelöst.
Wenn die TextDatei lang wird dann machst du hier extrem viele Operationen.
Und da Strings immutable sind wird bei jeder Änderung ein neuer string im Speicher angelegt.
Deshalb müllt dieser relativ schnell zu.
Eine Alternative wäre hier evtl. der StringBuilder welcher mutable ist.
Aber mach das besser so, dass du nicht die ganze Datei einlesen musst, weil sonst wird das sehr fehleranfällig und langsam
Gruss
Michael
der Fehler tritt in folgender Zeile auf:
string[] sCols = sContent.Split(delimiterstring, StringSplitOptions.None);
ich möchte Zeile 1 (also den gesamten inhalt der datei) durch den text ersetzten. Und mir ist gerade nochetwas eingefallen, wie kann ich zeilenumbrüche einfügen?
Hallo alab94,
wie gesagt wird dein Speicher überfüllt.
Beim Splitten kann das schon passieren wenn die Datei zu groß ist.
wie kann ich zeilenumbrüche einfügen?
dazu kannst du **:::
Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 5 und 8
Wenn du uns nicht sagst was du machen willst und wie groß die Datei ist dann können wir dir nicht bzw. nicht gut helfen
Gruss
Michael
Hallo alab94,
verwende lieber die StringBuilder-Klasse. Das hat den Vorteil, dass der Speicher wieder freigegeben wird. Stichwort: Garbage Collection.
Siehe auch [Artikel] Performant Strings verketten und [FAQ] Besonderheiten der String-Klasse (immutabler Referenztyp mit Wertsemantik). Die Fragen, die du stellst, sind wirklich Anfängerfragen. [Hinweis] Wie poste ich richtig? Punkt 1.1.
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.