Autor |
Beitrag |
C#
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: Sa 08.10.11 22:19
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?
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 09.10.11 01:07
Das kann ich so nicht reproduzieren, wie sieht der Code denn konkret aus?
|
|
C# 
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: So 09.10.11 01: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)
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 09.10.11 02:04
Auch mit dem Quelltext funktioniert es bei mir.
Kann es sein, dass du irgendwo sonst noch auf die Datei zugreifst?
|
|
C# 
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: So 09.10.11 11: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?
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 09.10.11 11: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# 
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: So 09.10.11 12: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 
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
ujr
      
Beiträge: 102
Erhaltene Danke: 12
|
Verfasst: So 09.10.11 12: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# 
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: So 09.10.11 12: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.
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 09.10.11 13: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. 
Für diesen Beitrag haben gedankt: C#
|
|
C# 
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: So 09.10.11 13: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  . Ich hab in den letzten 5min ein komplett neues Speichersystem entworfen (zumindest gedanklich  ).
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 
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
ujr
      
Beiträge: 102
Erhaltene Danke: 12
|
Verfasst: So 09.10.11 15: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# 
      
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: So 09.10.11 18:39
Nein. Aber jaenicke hat das Problem ja gelöst. jetzt funktioniert alles.
_________________ Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 09.10.11 20:16
|
|
|