Benutzer mit den meisten Antworten
Fehler beim Laden/Schreiben von Dateien!

Frage
-
Hallo,
ich programmiere noch nicht lange in C# und habe mal eine Frage:
Wieso kriege ich hier einen Fehler?
Hier meine Klasse zum Lesen von dateien:
public StreamReader sr; public FileManager(string path) { sr = new StreamReader(path); } public string getFullText() { string result = sr.ReadToEnd(); sr.Close(); return result; } public string[] getTextAndSplit(char breakpoint) { string[] s = sr.ReadToEnd().Split(breakpoint); sr.Close(); return s; } public string[] getTextLines() { string line; System.Collections.Generic.List<string> result = new System.Collections.Generic.List<string>(); int counter = 0 ; while ((line = sr.ReadLine()) != null) { result.Add(line); counter++; } sr.Close(); string[] lastresult = new string[result.Count]; int i = 0; foreach (string array in result) { lastresult[i] = array; i++; } return lastresult; }
und hier zum Schreiben von Dateien:
public class FileWriteManager { public StreamWriter sw; public FileWriteManager(string path) { sw = new StreamWriter(path); } public void ClearAll() { sw.WriteLine(""); sw.Flush(); sw.Close(); } public void WriteLinesInBannedPlayers(string[] lines) { string[] newlines = new string[new FileManager(DataWriter.BANNED_PLAYER_DATA_PATH).getTextLines().Length + lines.Length]; for(int z = 0; z < new FileManager(DataWriter.BANNED_PLAYER_DATA_PATH).getTextLines().Length; z++) { newlines[z] = new FileManager(DataWriter.BANNED_PLAYER_DATA_PATH).getTextLines()[z]; } for(int i = 0; i < lines.Length; i++) { newlines[i] = lines[i]; } sw.WriteLine(newlines); sw.Flush(); sw.Close(); } }
Das ganze führe ich dann hier aus:
public void reloadbannedplayerdata() { FileManager fm = new FileManager(BANNED_PLAYER_DATA_PATH); string[] parameters = fm.getTextLines(); Form1.UserTab.setBannedUserList(parameters, true); Form1.UserTab._banneduserlist = parameters; fm.sr.Close(); } public void WriteInBannedPlayerFile(string[] writelines, bool Override) { if (Override) new FileWriteManager(BANNED_PLAYER_DATA_PATH).ClearAll(); new FileWriteManager(BANNED_PLAYER_DATA_PATH).WriteLinesInBannedPlayers(writelines); }
In den Methoden wird dann eine Instanz der Klassen FileWriteManager und FileManager erzeugt. Die Methode WriteInBannedPlayerFile() wird vor der Methode reloadbannedplayerdata
aufgerufen. Also erst WriteInBannedPlayerFile() und danach reloadbannedplayerdata() Jedoch wenn ich das ganze starte bekomme ich diesen Fehler, dass angeblich noch auf die datei zugegriffen wird:
IOException wurde nicht6 behandelt:
Der Prozess kann nicht auf die Datei "J:\Visual C# Dokumente\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\banned-players.txt" zugreifen, da sie von einem anderen Prozess verwendet wird.
So wirklich nachvollziehen kann ich dies nicht, da ich ja beim FileWriteManager alle Streams immer sauber gecloset habe genau wie beim FileManager. Habe auch schon einiges ausprobiert jedoch ohne erfolg. Villeicht könnt ihr mir ja helfen :)
lg ThaCorp
Antworten
-
Hallo,
Warum verwendest du denn nicht die File-Klasse? Die bietet im Normalfall alles was man braucht wenn man nur "schnell" etwas in eine Datei schreiben bzw. lesen will. Damit könntest du dir einiges an Arbeit sparen ;)
Somit sparrst du dir auch IDisposable. Die Stream-Klassen machen so nur Sinn wenn man mehrere Operationen o.ä. mit einer Datei vor hat, ansonsten ist die File-Klasse einfach einfacher zu handhaben.
Koopakiller [kuːpakɪllɐ] | Webseite | Code Beispiele | Facebook | Snippets
- Als Antwort vorgeschlagen Stefan FalzModerator Samstag, 23. Februar 2013 13:07
- Als Antwort markiert Ionut DumaModerator Donnerstag, 28. Februar 2013 16:11
-
Hallo,
Generell sollte man es so halten: Streams so spät öffnen und so früh schließen wie möglich.
Du machst den Stream gleich im Konstruktor auf und solange hockt er auf der Datei.
Wenn ich mir die Methoden so anschaue: Verwende die Methoden aus System.IO.File,
wie ReadAllLines, WriteAllLines, die machen die Datei kurz auf, arbeiten und gleich wieder zu.Deine Klassen können sich im Konstruktor darauf beschränken, den Pfad zu speichern.
Gruß Elmar
- Als Antwort vorgeschlagen Stefan FalzModerator Samstag, 23. Februar 2013 13:07
- Als Antwort markiert Ionut DumaModerator Donnerstag, 28. Februar 2013 16:12
Alle Antworten
-
Hallo,
Warum verwendest du denn nicht die File-Klasse? Die bietet im Normalfall alles was man braucht wenn man nur "schnell" etwas in eine Datei schreiben bzw. lesen will. Damit könntest du dir einiges an Arbeit sparen ;)
Somit sparrst du dir auch IDisposable. Die Stream-Klassen machen so nur Sinn wenn man mehrere Operationen o.ä. mit einer Datei vor hat, ansonsten ist die File-Klasse einfach einfacher zu handhaben.
Koopakiller [kuːpakɪllɐ] | Webseite | Code Beispiele | Facebook | Snippets
- Als Antwort vorgeschlagen Stefan FalzModerator Samstag, 23. Februar 2013 13:07
- Als Antwort markiert Ionut DumaModerator Donnerstag, 28. Februar 2013 16:11
-
Hallo,
Generell sollte man es so halten: Streams so spät öffnen und so früh schließen wie möglich.
Du machst den Stream gleich im Konstruktor auf und solange hockt er auf der Datei.
Wenn ich mir die Methoden so anschaue: Verwende die Methoden aus System.IO.File,
wie ReadAllLines, WriteAllLines, die machen die Datei kurz auf, arbeiten und gleich wieder zu.Deine Klassen können sich im Konstruktor darauf beschränken, den Pfad zu speichern.
Gruß Elmar
- Als Antwort vorgeschlagen Stefan FalzModerator Samstag, 23. Februar 2013 13:07
- Als Antwort markiert Ionut DumaModerator Donnerstag, 28. Februar 2013 16:12