Autor Beitrag
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 09.10.11 01:07 
Das kann ich so nicht reproduzieren, wie sieht der Code denn konkret aus?
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: So 09.10.11 01:16 
ausblenden 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); //Combine the substrings to one string
            }
            try
            {
                File.WriteAllText(path, Cryption.Encrypt(text, Set.CryptionCode, Set.CryptionFactor, Set.CryptionChar)); //Writes the current items in the save-file
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }  //hier tritt der Fehler auf
           }

Hier wird er wieder abgespeichert.
ausblenden 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)      //If the SavePath variable is "", take the application's path
                                                    ? 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 09.10.11 02:04 
Auch mit dem Quelltext funktioniert es bei mir. :nixweiss:

Kann es sein, dass du irgendwo sonst noch auf die Datei zugreifst?
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: 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 :D

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
ujr
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 102
Erhaltene Danke: 12



BeitragVerfasst: 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# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 09.10.11 13:00 
Ich habe gerade kurz geschaut, das Problem ist mit dem Process Monitor ganz einfach zu finden (~2 Minuten ;-)):
ausblenden 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"))    //checking user name and hackalert
                                     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:

Für diesen Beitrag haben gedankt: C#
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: 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 :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:

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
ujr
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 102
Erhaltene Danke: 12



BeitragVerfasst: So 09.10.11 15:27 
user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:
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# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: So 09.10.11 18:39 
Nein. Aber user profile iconjaenicke hat das Problem ja gelöst. jetzt funktioniert alles.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 09.10.11 20:16 
user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:
//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. ;-)