Entwickler-Ecke
IO, XML und Registry - "Datei wird von einem anderen Prozess verwendet" stimmt nich
C# - Sa 08.10.11 21:19
Titel: "Datei wird von einem anderen Prozess verwendet" stimmt nich
Hallo,
also in meiner Anwendung wird ein Text ganz einfach in einer Text-Datei gespeichert, wenn das Programm geschlossen wird und beim nächsten Start wieder gelesen. So jetzt lade ich den kompletten Text in eine Variable und verwerte diesen. Wenn ich aber mein Programm schließe und der Text mit File.WriteAllText() wieder gespeichert werden soll, kommt es zu 2 Fällen:
1. Ist der mit File.ReadAllText() gelesene String der gleiche wie der, der wieder gespeichert werden soll, kommt die Exception: "Datei xyz wird von einem anderen Prozess verwendet"
2. Ist der mit File.ReadAllText() gelesene String nicht der gleiche wie der, der wieder gespeichert werden soll, funktioniert alles wie es soll ohne Exceptions.
Woran kann das liegen?
jaenicke - So 09.10.11 00:07
Das kann ich so nicht reproduzieren, wie sieht der Code denn konkret aus?
C# - So 09.10.11 00:16
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| private void SaveList() { string path = String.IsNullOrEmpty(Set.SavePath) ? user + ".dat" : Path.Combine(Set.SavePath, (user + ".dat")); string text = null; text += String.Format("USER={0}\nPW={1}", user, password); foreach (ListViewItem item in PwListView.Items) { text += String.Format("\n{2}{0}user{1}{3}{0}email{1}{4}{0}pw{1}{5}{0}date{1}{6}", '•', '○', item.Text, item.SubItems["user"].Text, item.SubItems["email"].Text, item.SubItems["pw"].Text, item.SubItems["date"].Text); } try { File.WriteAllText(path, Cryption.Encrypt(text, Set.CryptionCode, Set.CryptionFactor, Set.CryptionChar)); } catch (Exception ex) { MessageBox.Show(ex.Message); } } |
Hier wird er wieder abgespeichert.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| private void LoadList() { string filetext = File.ReadAllText((String.IsNullOrEmpty(Set.SavePath) ? user + ".dat" : Path.Combine(Set.SavePath, (user + ".dat")))); string decrypt = Cryption.Decrypt(filetext, Set.CryptionCode, Set.CryptionFactor, Set.CryptionChar); foreach (string line in decrypt.Split('\n').ToList().Where(line => !(line.ToLower().StartsWith("user=") || line.ToLower().StartsWith("pw=")))) { string itemname = line.Split('•')[0]; ListViewItem item = new ListViewItem { Text = itemname, Name = itemnum.ToString()}; itemnum += 1; foreach (string text in line.Split('•').Skip(1).ToArray()) { ListViewItem.ListViewSubItem sub = new ListViewItem.ListViewSubItem{Name = text.Split('○')[0], Text = text.Split('○')[1]}; new ListViewItem.ListViewSubItemCollection(item).Add(sub); } PwListView.Items.Add(item); } } |
und hier wird er geladen. (
'○' ist ein char, dass das System hier nicht verkraftet xD)
jaenicke - So 09.10.11 01:04
Auch mit dem Quelltext funktioniert es bei mir. :nixweiss:
Kann es sein, dass du irgendwo sonst noch auf die Datei zugreifst?
C# - So 09.10.11 10:20
Ich hab den code ca. 100x durchgesehen und nichts gefunden. Wenn sie noch irgendwo anders geöffnet wäre, würde es doch auch nicht klappen wenn der string ein anderer ist, als der geladene stirng.
Ist das vll ein Problem vom Compiler oder vom Debugger?
jaenicke - So 09.10.11 10:47
Du kannst z.B. mit dem Process Explorer (schnelle Übersicht über die offenen Handles) oder Process Monitor (Übersicht über alle Aktionen) schauen wann das Handle auf die Datei geöffnet und geschlossen wird während du mit dem Debugger schrittweise durchgehst.
Ansonsten kannst du auch das Projekt zum Testen komplett anhängen oder per PN schicken, wenn du möchtest.
C# - So 09.10.11 11:17
Das ist ja das komische. Ich bin da schon mit dem debugger schrittweise durch und hab die offenen Dateien gescannt. Und in der Liste war die Datei nämlich nicht dabei. ich poste dir mal den kompletten Code. Wunder dich aber nicht über meine Strukturierung xD. Ich bin Hobbyprogrammierer und brauch erst noch Erfahrung :D
ujr - So 09.10.11 11:38
Hallo,
wie sieht's aus mit einem Virenscanner? Könnte es daran liegen?
Vermutlich wäre auch ReadAllBytes/WriteAllBytes besser geeignet - durch das verschlüsseln ist der Text nicht mehr wirklich Text.
C# - So 09.10.11 11:47
| Zitat: |
1. Ist der mit File.ReadAllText() gelesene String der gleiche wie der, der wieder gespeichert werden soll, kommt die Exception: "Datei xyz wird von einem anderen Prozess verwendet"
2. Ist der mit File.ReadAllText() gelesene String nicht der gleiche wie der, der wieder gespeichert werden soll, funktioniert alles wie es soll ohne Exceptions. |
Wenn es ein Virenscanne wäre, würde doch in beiden Fällen eine Exception auftreten oder? Aber bei mir tritt sie ja nur im 1. Fall auf.
jaenicke - So 09.10.11 12:00
Ich habe gerade kurz geschaut, das Problem ist mit dem Process Monitor ganz einfach zu finden (~2 Minuten ;-)):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| private void LoginBut_Click(object sender, EventArgs e) { string user = UserBox.Text, pw = PwBox.Text, filepath = Path.Combine(Set.SavePath, user + ".dat"); if (user == null || pw == null) { MessageBox.Show("Password or username can not be empty!"); return; } foreach (string file in (from file in Directory.GetFiles((String.IsNullOrEmpty(Set.SavePath)) ? Application.StartupPath : Set.SavePath).Where(file => file.EndsWith(".dat")) let getfiles = new StreamReader(file) let text = Cryption.Decrypt(getfiles.ReadToEnd(), Set.CryptionCode, Set.CryptionFactor, Set.CryptionChar) where text.StartsWith("USER=" + user) select file).Where(file => filepath == file)) { MessageBox.Show("Someone tried to hack your datas!\nThe file will be restored."); File.Move(file, filepath); } ... |
Beim Login wird dieser Dateizugriff nie wieder freigegeben.
// EDIT:
Nebenbei: Das Wort datas gibt es im Englischen nicht, genau wie bei information, wo der Plural auch ohne s geschrieben wird. :zwinker:
C# - So 09.10.11 12:12
Ok ich werde die Rechtschreibfehler beheben xD. Ich dachte wenn ich den Streamreader in ner foreach dekleration habe ist es das gleiche wie in einem using-Block, dass sich der reader wieder von selbst schließt und freigibt. Aber warum kommt dann nur die Exception dann nur wenn die beiden Strings gelich sind??
Den ganzen Block kann ich sowieso löschen xD. Der steht da völlig überflüssig weil die Prüfung falsch rum ist :D. Ich hab in den letzten 5min ein komplett neues Speichersystem entworfen (zumindest gedanklich :D).
Aber Danke für die Hilfe
//Edit:
Wenn du schon meinen Code hast, kannst du mal nachsehen warum sich die Anwendung trotz Application.Exit() nicht schließt? Ich komm nich drauf :suspect:
ujr - So 09.10.11 14:27
C# hat folgendes geschrieben : |
| Wenn es ein Virenscanne wäre, würde doch in beiden Fällen eine Exception auftreten oder? |
Da es sich in diesem Fall um ein Laufzeitproblem handeln würde, ist das eben gerade nicht zweifelsfrei festzustellen.
Aber zum Login-Button-Klick - nach allen Zugriffen auf die Datei in Deinem Code zu suchen, sollte ja nicht das Problem sein, oder?
C# - So 09.10.11 17:39
Nein. Aber
jaenicke hat das Problem ja gelöst. jetzt funktioniert alles.
jaenicke - So 09.10.11 19:16
C# hat folgendes geschrieben : |
//Edit:
Wenn du schon meinen Code hast, kannst du mal nachsehen warum sich die Anwendung trotz Application.Exit() nicht schließt? Ich komm nich drauf :suspect: |
Ich denke mal weil deine Anwendung mit deinem eigenen ApplicationContext kein Hauptformular hat. Deshalb wird dessen Closed Ereignis auch nicht ausgelöst und Application.Run läuft endlos weiter. Aber damit kenne ich mich nicht aus, das habe ich mir noch nie genauer angeschaut.
Stell diese Frage bitte ggf. in einem neuen Thread. ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!