2009-07-24 4 views
0

Eine Firma, für die ich arbeite, verwendet manchmal super-obligatorische Profile für ihre Benutzer. Leider kann dies zu vielen Problemen führen, wenn die Benutzereinstellungen beim Abmelden nicht gespeichert werden und so weiter. Um dies zu umgehen, wird eine .reg-Datei beim Start ausgeführt. Für einige dieser Einstellungen wurde regmon zum Aufzeichnen verwendet, um die Einstellungen zu ändern und eine reg-Datei zu erstellen. Das Problem dabei ist, dass es viele doppelte Einträge gibt, die es jedes Mal größer und größer machen. Übrigens habe ich dieses Verfahren nicht implementiert, ich muss einfach damit leben.C# Reinigen Sie eine Registrierungsdatei .reg, um doppelte Einträge zu entfernen

Ich werde versuchen, dies auf das Minimum zu reinigen, aber ich frage mich, ob jemand das schon mal gemacht hat. Was ich tue, ist denke, ich las die Zeilen in ein 2D-Array so:

[HKEY_CURRENT_USER \ Software \ CELCAT \ CT \ SAT \ Settings]
"OpenTTVS" = "0"
"OTTFrmW" = "420 "
"OTTFrmH"=" 321"

wird:
[HKEY_CURRENT_USER \ Software \ CELCAT \ CT \ SAT \ Settings], "OpenTTVS" = "0" [HKEY_CURRENT_USER \ Software \ CELCAT \ CT \ SAT \ Settings], "OTTFrmW" = "420" [HKEY_CURRENT_USER \ Software \ CELCAT \ CT \ SAT \ Settings], "OTTFrmH" = "321"

Entfernen Sie dann die Duplikate in umgekehrter Reihenfolge. Wenn eine Einstellung zweimal geändert wird, werden die Einträge zuerst in der Datei entfernt.

Dann sortieren Sie das Array nach dem Bienenstock und geben Sie den Schlüssel jedes Mal und den Bienenstock, wenn es sich ändert. Entschuldigung, wenn die Terminologie falsch ist.

Funktioniert das? Wahrscheinlich besser mit einer Sammlung als mit einem Array, aber Sie bekommen die Idee.

Antwort

2

Für einen ersten Versuch würde ich diese .reg-Datei in einen Baum lesen, so wie Regedit aussieht. Beim Aufbau des Baumes prüfen Sie, ob ein Knoten existiert. Wenn nicht, erstellt es sonst den vorhandenen Wert überschreiben.

So erhalten Sie nur den letzten Eintrag, der in Kraft tritt. Nachdem Sie diesen Baum erstellt haben, müssen Sie den aktuellen Baum zurücklesen und Sie sind bereit.

Während ich dies schreibe, habe ich eine andere Idee: Öffnen Sie die .reg-Datei in einem Texteditor. Ersetzen Sie "[HKEY_CURRENT_USER \" gegen "[HKEY_CURRENT_USER \ JustSomeKeyThatDoesNotExists" und importieren Sie diese Datei in die Registrierung. Öffnen Sie nun die Registrierung und exportieren Sie das ganze "[HKEY_CURRENT_USER \ JustSomeKeyThatDoesNotExists" zurück in eine Datei. Öffnen Sie die Datei und führen Sie den ersten Austausch rückwärts durch.

Jetzt haben Sie eine Datei mit einem eindeutigen Wert in einer sortierten Reihenfolge. ;-))

+0

Wie deine zweite Idee wirklich gut das hat es ausprobiert und es hat super geklappt. – PeteT

2

Sie könnten ein Dictionary of Dictionaries verwenden. In Pseudo-Code, könnten Sie so etwas wie dies dann tun:

Dictionary<String, Dictionary<String, String>> regSettings 
Dictionary<String, String> current 
for line in sourcefile { 
    if line.startswith("[") { 
     if !regSettings.haskey(line) { 
      regSettings.add(line, new Dictionary<String, String>()) 
     } 
     current = regSettings[line] 
    } else { 
     key, value = line.split("=") 
     current[key] = value; 
    } 
} 

Es gibt einige Details zu Konto für (Leerzeilen, Kommentare, schlecht in Erinnerung Funktionsnamen, die für C# eingestellt werden sollen ...), aber das ist die Grundidee. Wenn Sie auf eine doppelte Einstellung stoßen, ersetzt der spätere Wert den älteren Wert in der Sammlung. Um die Datei zu schreiben, geben Sie einfach den reg-Header aus, iterieren Sie dann Ihre Sammlungen und schreiben Sie den obersten Schlüsselnamen gefolgt von allen Werten für diesen Schlüssel.