Forum: PC-Programmierung C# RegistryKey: Subs und Values löschen


von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Hallo,
wie schon beschrieben möchte ich alle Sub Keys und Values aus einem 
gegebenen RegistryKey löschen. Es gibt hunderte Beispiele, die alle mit 
einer Fehler-Ausgabe enden: "Der Registrierungsschlüssel enthält 
Unterschlüssel. Das rekursive Entfernen wird von dieser Methode nicht 
unterstützt." - und die Einträge sind dann natürlich nicht gelöscht.
Deshalb will ich mir selber eine rekursive Funktion dafür schreiben, 
jedoch funktioniert die auch nicht. ;-)

Ich kann meinen Fehler nicht finden...
1
public static Boolean Remove_AllContent(RegistryKey CurrentKey)
2
{
3
    if (CurrentKey != null)
4
    {
5
        try
6
        {
7
            // Values von CurrentKey Löschen (geht anscheinend):
8
            for (int i = 0; CurrentKey.ValueCount > i; i++)
9
            {
10
                // Namen finden:
11
                String ValString = CurrentKey.GetValueNames()[i];
12
                // Löschen der Value:
13
                CurrentKey.DeleteValue(ValString);
14
            }
15
16
            // SubKeys von CurrentKey Löschen:
17
            for (int i = 0; CurrentKey.SubKeyCount > i; i++)
18
            {
19
                // Namen finden:
20
                String SubKeyString = CurrentKey.GetSubKeyNames()[i];
21
                // Diese Funktion mit Subkey erneut Aufrufen rekursive (Inhalt leeren):
22
                Remove_AllContent(CurrentKey.OpenSubKey(SubKeyString, true));
23
                // SubKey müsste jetzt leer sein - eigentliches Löschen des Keys:
24
                CurrentKey.DeleteSubKey(SubKeyString);
25
                // ------------------------------------------------
26
                // DeleteSubKeyTree geht auch nicht, und sollte aber auch nicht mehr nötig sein.
27
                // CurrentKey.DeleteSubKeyTree(SubKeyString);
28
            }
29
            return true;
30
        }
31
        catch (Exception ex)
32
        {
33
            Debug.WriteLine(CurrentKey.ToString() + Environment.NewLine + ex.Message);
34
        }
35
    }
36
    return false;
37
}
Es soll zuerst im 'eigenen' RegistryKey die Values löschen, und dann in 
die SubKeys hinein gelangen - Dort ebenso die Values löschen, dann darin 
(wieder) alle SubKeys abklappern usw...
Ganz ohne "Key.DeleteSubKeyTree", was auch nicht funktioniert hat!?
Müsste doch eigentlich gehen?

Aber es werden nicht mal die Schleifen komplett durchlaufen - und auch 
versucht volle RegistryKeys zu löschen, was wieder den besagten Fehler: 
"rekursive Entfernen wird von dieser Methode nicht unterstützt" - 
ausgibt. Jedoch sollte das durch den eigenen Code eigentlich gar nicht 
mehr vorkommen!!?? Irgendwie wird die Schleife, die z.B. 2 Durchläufe 
haben soll, vorzeitig verlassen, dadurch ist ein "Parent-Key" nicht ganz 
leer (enthält noch SubKeys).

Der erzeugte Fehler wird abgefangen, und "nach mehrmaligen Versuchen des 
Löschens" ist dann auch alles weg. Ich weiß aber nicht woran das liegt. 
Es soll schon direkt funktionieren ;-)
Kann mir jemand auf die Sprünge helfen? Bin mit dem Rekrusiven wohl doch 
noch nicht so fitt. ;-)

Danke schon mal - und Gruß, tsx

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Grad beim nochmal drüberlesen fällt mir ein:
1
String ValString = CurrentKey.GetValueNames()[i];
2
CurrentKey.DeleteValue(ValString);
und "das nächste i",
vertragen sich nicht wegen dem löschen... Rein logisch geht es so ja 
eigentlich gar nicht. (Ups) Aber ist dass schon der Fehler? Kann das 
sein?
Ich versuch´s wohl noch mal.

: Bearbeitet durch User
von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Ok, ich habs. Ich brauch überhaupt kein i, nur überall 0; Die Schleife 
hat sich sonnst selbst aufgegessen.
Neu:
1
for (int i = 0; CurrentKey.ValueCount > 0; i++)
2
{
3
   NameString = CurrentKey.GetValueNames()[0];                        
4
   CurrentKey.DeleteValue(NameString);
5
}
Danke trotzdem.

Edit: Thread kann gelöscht werden, und ich werde einen anderen 
Schleifentyp benutzen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.