C# WPF bestimmte Zeile aus einer txt löschen?
Moin,
ich habe eine ListBox deren Inhalt aus einer txt eingelesen wird, nun möchte ich aber wenn ein bestimmter Button gedrückt wird, das dass Programm jede einzelne Zeile der txt einzelnt durch liest und nur eine bestimmte Zeile löscht.
Beispielsweise in der txt und somit auch in der ListBox sind folgende dinge genau so aufgelistet:
Objekt1
Objekt2
Objekt3
Eine TextBox enthält den Text Objekt 2.
Wenn ich jetzt einen bestimmten Button drücke soll das Objekt2 nun aus der txt gelöscht werden.
Selbiges habe ich für eine ComboBox entsprechend Programmiert und das funktioniert auch, nur bei der ListBox irgendwie nicht.
Ich wäre für jegliche Hilfe dankbar!
2 Antworten
Lies alle Textzeilen ein, filtere den gesuchten Text heraus und schreibe die Daten wieder zurück.
Hierbei könntest du entweder mit Linq direkt alle Vorkommen herausfiltern:
const string filepath = "path/to/your/file.txt";
var lines = File.ReadAllLines(filepath);
File.WriteAllLines(filepath, lines.Where(line => line != yourTextBox.Text));
Oder du baust dir das Array mit zwei Schleifen neu zusammen, wenn du weißt, dass der gesuchte Wert ganz sicher immer nur einmal vorkommt.
// read file ...
var index = 0;
var filteredLines = lines.TakeWhile(line =>
{
++index;
return line != yourTextBox.Text;
}).ToList();
for (; index < lines.Length; ++index)
{
filteredLines.Add(lines[index]);
}
// write to file ...
PS.: Statt mit ReadAllLines zu arbeiten, könntest du auch einen StreamReader nutzen, um den Generatorzwischenschritt zu überspringen.
const int bufferSize = 512;
var lines = new List<string>();
using (var fileStream = File.OpenRead(filepath))
{
using (var reader = new StreamReader(fileStream, Encoding.UTF8, true, bufferSize))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if (yourTextBox.Text != line)
{
lines.Add(line);
}
}
}
}
// write lines to file ...
string[] lines = File.ReadAllLines("meineDatei.txt");
for (int i = 0; i < lines.Length; i++)
{
if (lines[i] == textBox1.Text)
{
lines = lines.Where((val, idx) => idx !=i).ToArray();
break;
}
}
File.WriteAllLines("meineDatei.txt", lines);
Dieser Code öffnet die txt-Datei, liest sie Zeile für Zeile ein und speichert jede Zeile in einem String-Array. Anschließend wird das Array durchsucht und die gewünschte Zeile wird entfernt. Schließlich wird das Array in die txt-Datei zurückgeschrieben.
Dein Lösungsvorschlag würde nur im Best-Case-Szenario (wenn der zu löschende Eintrag am Anfang der Liste steht) einmal durch die Liste laufen. Im schlechtesten Fall würde er zweimal durch die komplette Liste gehen.