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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Tim S. (Firma: tsx) (freak_ts) Benutzerseite


Bewertung
0 lesenswert
nicht 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: tsx) (freak_ts) Benutzerseite


Bewertung
0 lesenswert
nicht 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: tsx) (freak_ts) Benutzerseite


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.