Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
.NET 4.x

Удаление разделов реестра в цикле

09.08.2017, 22:32. Показов 1649. Ответов 18

Студворк — интернет-сервис помощи студентам
Подскажите можно как-нибудь удалить разделы реестра используя List<string> ?

C#
1
2
3
4
5
static List<string> LoggerSearch = new List<string>()
{
    @"HKEY_CURRENT_USER\Software\Logger",
    @"HKEY_LOCAL_MACHINE\SOFTWARE\Logger"
};
Если стандартно используется такая схема:

C#
1
Registry.LocalMachine.DeleteSubKeyTree(LoggerPath, true);
Почему именно в цикле? ( отвечаю )

У меня не получается удалить 2 раздела реестра в такой последовательности:

C#
1
2
Registry.LocalMachine.DeleteSubKeyTree(LoggerPath, true);
Registry.CurrentUser.DeleteSubKeyTree(LoggerPath, true);
Если только использовать для каждого try/catch но как-то это не культурно =)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.08.2017, 22:32
Ответы с готовыми решениями:

Проверка изменения ключей в разделов реестра
Помогите сделать проверку только уже выбранных разделов реестра: ссылка на программу для проверки реестра:...

Удаление разделов реестра по маске
Добрый вечер! Очень прошу вашей помощи. Нужен батник, который бы находил во всех разделах реестра все папки с заданным названием (например...

Завершение сразу нескольких процессов и удаление связанных с ними разделов реестра
Здравствуйте. Существует такая проблема, думаю она встречалась многим.(Т.е иногда скачав программку при её инсталяции устанавливается в...

18
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18274 / 14197 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
10.08.2017, 00:12
Цитата Сообщение от chaleureux Посмотреть сообщение
У меня не получается удалить 2 раздела реестра в такой последовательности:
C#
1
2
Registry.LocalMachine.DeleteSubKeyTree(LoggerPath, true);
Registry.CurrentUser.DeleteSubKeyTree(LoggerPath, true);
Eсли только использовать для каждого try/catch но как-то это не культурно =)
Передать false вторым аргументом не судьба?
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
10.08.2017, 00:18  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Передать false вторым аргументом не судьба?
Так вроде же если в папке есть ещё что-то он не удалит их через false ?! Нет? =)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18274 / 14197 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
10.08.2017, 00:24
chaleureux, подсказка - аргументам не зря дают нормальные названия. Посмотри на название второго аргумента и получишь ответ на свой вопрос.
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
10.08.2017, 00:29  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
подсказка - аргументам не зря дают нормальные названия. Посмотри на название второго аргумента и получишь ответ на свой вопрос.
Ну спасибо конечно за прозрение) Учту.
Но всё же, можно как-нибудь решить эту проблему через цикл for ? =)
Как прогнать в цикле for список LoggerSearch?))
В таком виде: Registry.DeleteSubKeyTree(LoggerSearch[i]); ?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18274 / 14197 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
10.08.2017, 00:32
chaleureux, можно и через цикл. Для этого нужно написать код который смотрит имя раздела (hive) в начале пути, берет нужный корень и затем вызывает DeleteSubKeyTree для ключа.
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
10.08.2017, 00:43  [ТС]
OwenGlendower, Я немного запутался, не знаю как работать в цикле с реестром, точнее как ему записать типа Registry.DeleteSubKeyTree без LocalMachine =)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18274 / 14197 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
10.08.2017, 00:49
chaleureux, показываю для одного ключа и одного раздела. Цикл и остальное добавишь самостоятельно
C#
1
2
3
4
5
6
string keyName = @"HKEY_CURRENT_USER\Software\Logger";
string[] hiveAndName = keyName.Split(new[]{'\\'}, 2);
RegistryKey root;
if ("HKEY_CURRENT_USER".Equals(hiveAndName[0], StringComparison.OrdinalIgnoreCase)) root = Registry.CurrentUser;
// else if ... // TODO
root.DeleteSubKeyTree(hiveAndName[1], false);
2
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
10.08.2017, 13:39  [ТС]
OwenGlendower, Хочу немного уточнить..
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static List<string> LoggerSearch = new List<string>()
{
     @"HKEY_CURRENT_USER\Software\Logger",
     @"HKEY_LOCAL_MACHINE\SOFTWARE\Logger"
};
 
for (var j = 0; j < LoggerSearch.Count; j++)
{
     string[] hiveAndName = LoggerSearch[j].Split(new[] { '\\' },2);
     if ("HKEY_CURRENT_USER".Equals(hiveAndName[0], StringComparison.OrdinalIgnoreCase))
     {
          root = Registry.CurrentUser;
          root.DeleteSubKeyTree(hiveAndName[1], false);
     }
}
Вот делаю Я в цикле всё это)
С ветки HKEY_CURRENT_USER всё удалилось успешно.
А изHKEY_LOCAL_MACHINE нет.

Как оно вообще работает?))

Добавлено через 3 минуты
А всё разобрался))

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
for (var j = 0; j < LoggerSearch.Count; j++)
{
     string[] hiveAndName = LoggerSearch[j].Split(new[] { '\\' },2);
     if ("HKEY_CURRENT_USER".Equals(hiveAndName[0], StringComparison.OrdinalIgnoreCase))
     {
          root = Registry.CurrentUser;
          root.DeleteSubKeyTree(hiveAndName[1], false);
     }
     else if ("HKEY_LOCAL_MACHINE".Equals(hiveAndName[0], StringComparison.OrdinalIgnoreCase))
     {
          root = Registry.LocalMachine;
          root.DeleteSubKeyTree(hiveAndName[1], false);
      }
}
Так работает).

Вопрос: В списке
Code
1
List<string>
Нужно ли записывать полные пути в разделам?
@"HKEY_CURRENT_USER\Software\Logger" ?
Или же можно убрать не нужный HKEY_CURRENT_USER ?
Ведь в if мы уже задаём проверку на нужную ветку

И ещё вопрос как можно заменить:
C#
1
string[] hiveAndName = LoggerSearch[j].Split(new[] { '\\' },2);
За место Split поставить StartsWith ?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18274 / 14197 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
10.08.2017, 13:41
chaleureux, почему тебя такие простые вещи до сих пор ставят в тупик?
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
10.08.2017, 13:56  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
почему тебя такие простые вещи до сих пор ставят в тупик?
Да я просто спросил, хотел узнать твоё мнение =)

Добавлено через 10 минут
Нашёл ещё 1 способ:

C#
1
2
3
4
5
6
7
foreach(var key in LoggerSearch)
{
    var psi = new ProcessStartInfo("REG", @"DELETE {key} /f");
    //ключ /f подавляет запрос подтверждения операции
    psi.UseShellExecute = false;//глушим мелькание консоли
    Process.Start(psi);
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18274 / 14197 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
10.08.2017, 14:02
Цитата Сообщение от chaleureux Посмотреть сообщение
Нужно ли записывать полные пути в разделам?
@"HKEY_CURRENT_USER\Software\Logger" ?
Или же можно убрать не нужный HKEY_CURRENT_USER ?
Ведь в if мы уже задаём проверку на нужную ветку
Нельзя. Почему так, подумай самостоятельно.

Цитата Сообщение от chaleureux Посмотреть сообщение
За место Split поставить StartsWith ?
Поставить можно, но от Split все равно не уйти т.к. нам нужно отдельно название hive и название ключа. Поэтому со Split получается проще.

Цитата Сообщение от chaleureux Посмотреть сообщение
Да я просто спросил, хотел узнать твоё мнение =)
Мой вопрос относился только к коду с if-ом. На будущее - не надо добавлять вопросы путем редактирования постов. Это сбивает с толку. Вместо этого нужно писать новое сообщение. Если никто не успел ответить, то оно автоматически присоединится к прошлому сообщению. Если уже успели ответить, то это будет новое сообщение. И главное в обоих случаях участники темы получат уведомление на email о новом сообщении. При редактировании сообщения такие уведомления не рассылаются.

Ответ на вопрос все-таки хочется услышать.

Добавлено через 3 минуты
Цитата Сообщение от chaleureux Посмотреть сообщение
Нашёл ещё 1 способ:
Это упрошает код, но сильно замедляет простую операцию. Я бы не стал так делать.

Цитата Сообщение от chaleureux Посмотреть сообщение
@"DELETE {key} /f"
Нужна ли здесь @ или все-таки можно без неё?
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
10.08.2017, 14:56
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Нужна ли здесь @ или все-таки можно без неё?
А там не должен ли быть знак доллара ($)?
Это вроде форматирование строки из C# 6.0.

Я это не очень часто юзаю(пока) поэтому спрашиваю
2
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18274 / 14197 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
10.08.2017, 15:02
Цитата Сообщение от LeniumSoft Посмотреть сообщение
А там не должен ли быть знак доллара ($)?
Судя по всему да. Спасибо за наблюдательность
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
11.08.2017, 01:56  [ТС]
А как проверить ветки реестра из цикла если они есть оповестить если нету проигнорировать и продолжить выполнение.
C#
1
2
3
4
5
6
if ("HKEY_CURRENT_USER".Equals(hiveAndName[0], StringComparison.OrdinalIgnoreCase))
{
      root = Registry.CurrentUser;
      root.DeleteSubKeyTree(hiveAndName[1], false);
      Console.WriteLine($"Раздел { hiveAndName[1] }  удалён успешно.");
}
В обоих случаях он оповещает пользователя что мол он прошёлся и удалил все нужные ветки.
Но в разделе реестра этих веток нету, а он всё ровно пишет что удалил =)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18274 / 14197 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
11.08.2017, 14:06
chaleureux,
C#
1
2
3
4
5
6
7
8
try
{
    root.DeleteSubKeyTree(hiveAndName[1], true);
    Console.WriteLine($"Раздел { hiveAndName[1] }  удалён успешно.");
}
catch
{
}
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
11.08.2017, 14:57  [ТС]
OwenGlendower, Я и try/catch ставил =)
Как проверку сделать на этом примере?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18274 / 14197 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
11.08.2017, 14:59
chaleureux, я уже показал как. Проверка обеспечивается путем try/catch и передачей true в метод DeleteSubKeyTree
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
11.08.2017, 15:08  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
я уже показал как. Проверка обеспечивается путем try/catch и передачей true в метод DeleteSubKeyTree
Прошу прощения =) за мою не внимательность.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.08.2017, 15:08
Помогаю со студенческими работами здесь

Рекурсивный обход разделов реестра
Приветствую. Есть кусок говнокода set registry=REG ADD &quot;HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\ ...

Запись данных во множество разделов реестра
Необходимо во множество (примерно 300) разделов прописать пакет одних и тех же параметров. Как это можно автоматизировать по маске?

Как узнать список разделов ветки реестра?
Приветствую всех умных и опытных людей. Частенько приходится устанавливать ОС друзьям и знакомым, относящихся к категории людей, которые из...

Экспорт каждого из определённых разделов реестра в отдельный файл
Можно ли средствами cmd экспортировать ключи из ветки &quot;HKEY_CURRENT_USER\Software&quot; при этом каждый подключ поместить в отдельный reg файл? ...

Создание разделов,подразделов, параметров реестра через Bat файл
Всем доброе время суток. У меня к вам вопрос , товарищи! Перепробовал кучу способов создания раздела и подраздела в реестре через Батник,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru