System.IO.IOException: The process cannot access the file'...' because it is being used by another process?
Wie kann ich das bei diesem Code verhindern;
var path = @"...";
var there = File.ReadAllText(path);
using (StreamWriter writer = new StreamWriter(path))
{
string Text2 = textBox2.Text;
foreach (var line in File.ReadAllLines(path)) //Fehler
{
if (line.Contains(textBox2.Text))
{
MessageBox.Show("..'{0}'..", Text2);
}
else
{
writer.WriteLine("{0}{1} {2}", there,...,...);
}
}
}
Ich könnte die Schleife nach Außen setzen und den Using-Block in das if, doch mir wurde gesagt, dass man für sowas im generellen lieber ein Using-Block benutzt, weswegen ich es vorzugsweise im Using-Block machen würde. Doch wenn nichts dran vorbei führt, auch außerhalb.
Danke für Antworten
Der Code bewirkt dass in einem TXT-File die Vorhandenen Daten auf die in textxBox2 hinzugefügten Daten überprüft, also wenn die Daten schon vorhanden sind, wird der if-Block ausgeführt
1 Antwort
Es fällt auf, dass du deine Datei doppelt einliest.
var there = File.ReadAllText(path);
// ...
foreach (var line in File.ReadAllLines(path)) //Fehler
Führe doch stattdessen diese Aktion nur einmal durch, bevor du den Writer öffnest (dann kommen sich die verschiedenen Prozesse, die auf die Datei zugreifen, auch nicht mehr ins Gehege).
var lines = File.ReadAllLines(path);
// use writer ...
Wieso du im Fall, dass die Textboxeingabe nicht in einer Zeile steht, nochmal den kompletten Inhalt der Datei einfügen möchtest, kann ich nicht nachvollziehen. Aber dafür kannst du dir, direkt nach dem Einlesen auch alle Zeilen leicht wieder zusammentackern lassen:
var fullText = string.Join(Environment.NewLine, lines);
Du könntest dir den Ablauf mit dem Writer auch sparen.
Erst liest du wie gehabt alle Zeilen ein und schaust, ob die Eingabe schon existiert. Wenn ja, springst du entweder direkt aus der Methode heraus oder merkst es dir zumindest.
Am Ende der Schleife setzt du (wenn die Eingabe nicht gefunden werden konnte) die AppendAllLines-Methode der File-Klasse ein.
File.AppendAllLines(path, new [] { textBox2.Text });
Erstmal danke, danke, danke für die Lösung. Das hat mich zum verzweifeln gebracht.
Bei der Textdatei handelt es sich um eine Art Datenspeicher von Usernamen + Passwort und damit die Daten nicht einfach gelöscht werden, schreibe ich die Daten die schon vorhanden sind + die neuen, wenn diese nicht schon vorhanden sind.