2009-07-24 4 views
0

Компания, в которой я работаю, иногда использует супер обязательные профили для своих пользователей. К сожалению, это может вызвать множество проблем с сохранением пользовательских настроек при выходе из системы и т. Д. Чтобы обойти это, файл .reg запускается при запуске. Для некоторых из этих настроек regmon использовался для записи изменений настроек и создания файла reg. Беда в этом состоит в том, что у них много повторяющихся записей, делая их все больше и больше каждый раз, когда это было сделано. Кстати, я не реализовал эту процедуру, мне просто нужно жить с ней.C# Очистить файл реестра .reg, чтобы удалить повторяющиеся записи

Я собираюсь попытаться очистить это до минимума, но мне интересно, сделал ли кто-нибудь это раньше. То, что я имею в виду, есть, я читаю строки в 2d массив так:

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

становится:
[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"

Затем удалите дубликаты в обратном порядке, поэтому, если параметр изменен дважды, он удаляет записи сначала в файле.

Затем сортируйте массив по улью и выведите ключ каждый раз, и улей, когда он изменится. Извините, если терминология неверна.

Будет ли это работать? Вероятно, лучше использовать коллекцию, а не массив, но вы получите эту идею.

ответ

2

Для первой попытки я прочитал бы этот .reg-файл в дереве, как выглядит regedit. Создав дерево, вы просто проверяете, существует ли узел. Если нет, создайте его, перезапишите существующее значение.

Таким образом, вы получите только последнюю запись, которая вступает в силу. После создания этого дерева вам нужно будет прочитать текущее дерево, и вы будете готовы.

При написании этого вопроса у меня появится другая идея: Открыть .reg-файл в текстовом редакторе. Замените "[HKEY_CURRENT_USER \" на "[HKEY_CURRENT_USER \ JustSomeKeyThatDoesNotExists" и импортируйте этот файл в реестр. Теперь откройте реестр и экспортируйте все «[HKEY_CURRENT_USER \ JustSomeKeyThatDoesNotExists» обратно в файл. Откройте файл и сделайте первую замену назад.

Теперь у вас будет файл с уникальным значением в отсортированном порядке. ;-))

+0

Как и ваша вторая идея, действительно хорошая, которая пробовала, и она отлично работала. – PeteT

2

Вы можете использовать Словарь Словари. В псевдокоде, вы могли бы сделать что-то вроде этого:

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; 
    } 
} 

Есть некоторые детали, чтобы учесть (пустые строки, комментарии, плохо запоминаются имена функций, которые должны быть отрегулированы для C# ...), но это Основная идея. Когда вы сталкиваетесь с повторяющимся параметром, более позднее значение заменяет более старый в коллекции. Чтобы записать файл, просто введите заголовок reg, затем выполните итерацию ваших коллекций, написание имени ключа верхнего уровня, а затем все значения для этого ключа.

Смежные вопросы