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

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

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

Author24 — интернет-сервис помощи студентам
Подскажите можно как-нибудь удалить разделы реестра используя 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2017, 22:32
Ответы с готовыми решениями:

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

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

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

Рекурсивный обход разделов реестра
Приветствую. Есть кусок говнокода set registry=REG ADD...

18
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
10.08.2017, 00:12 2
Цитата Сообщение от chaleureux Посмотреть сообщение
У меня не получается удалить 2 раздела реестра в такой последовательности:
C#
1
2
Registry.LocalMachine.DeleteSubKeyTree(LoggerPath, true);
Registry.CurrentUser.DeleteSubKeyTree(LoggerPath, true);
Eсли только использовать для каждого try/catch но как-то это не культурно =)
Передать false вторым аргументом не судьба?
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
10.08.2017, 00:18  [ТС] 3
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Передать false вторым аргументом не судьба?
Так вроде же если в папке есть ещё что-то он не удалит их через false ?! Нет? =)
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
10.08.2017, 00:24 4
chaleureux, подсказка - аргументам не зря дают нормальные названия. Посмотри на название второго аргумента и получишь ответ на свой вопрос.
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
10.08.2017, 00:29  [ТС] 5
Цитата Сообщение от OwenGlendower Посмотреть сообщение
подсказка - аргументам не зря дают нормальные названия. Посмотри на название второго аргумента и получишь ответ на свой вопрос.
Ну спасибо конечно за прозрение) Учту.
Но всё же, можно как-нибудь решить эту проблему через цикл for ? =)
Как прогнать в цикле for список LoggerSearch?))
В таком виде: Registry.DeleteSubKeyTree(LoggerSearch[i]); ?
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
10.08.2017, 00:32 6
chaleureux, можно и через цикл. Для этого нужно написать код который смотрит имя раздела (hive) в начале пути, берет нужный корень и затем вызывает DeleteSubKeyTree для ключа.
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
10.08.2017, 00:43  [ТС] 7
OwenGlendower, Я немного запутался, не знаю как работать в цикле с реестром, точнее как ему записать типа Registry.DeleteSubKeyTree без LocalMachine =)
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
10.08.2017, 00:49 8
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
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
10.08.2017, 13:39  [ТС] 9
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);
      }
}
Так работает).

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

И ещё вопрос как можно заменить:
C#
1
string[] hiveAndName = LoggerSearch[j].Split(new[] { '\\' },2);
За место Split поставить StartsWith ?
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
10.08.2017, 13:41 10
chaleureux, почему тебя такие простые вещи до сих пор ставят в тупик?
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
10.08.2017, 13:56  [ТС] 11
Цитата Сообщение от 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
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
10.08.2017, 14:02 12
Цитата Сообщение от 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
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
10.08.2017, 14:56 13
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Нужна ли здесь @ или все-таки можно без неё?
А там не должен ли быть знак доллара ($)?
Это вроде форматирование строки из C# 6.0.

Я это не очень часто юзаю(пока) поэтому спрашиваю
2
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
10.08.2017, 15:02 14
Цитата Сообщение от LeniumSoft Посмотреть сообщение
А там не должен ли быть знак доллара ($)?
Судя по всему да. Спасибо за наблюдательность
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
11.08.2017, 01:56  [ТС] 15
А как проверить ветки реестра из цикла если они есть оповестить если нету проигнорировать и продолжить выполнение.
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
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
11.08.2017, 14:06 16
chaleureux,
C#
1
2
3
4
5
6
7
8
try
{
    root.DeleteSubKeyTree(hiveAndName[1], true);
    Console.WriteLine($"Раздел { hiveAndName[1] }  удалён успешно.");
}
catch
{
}
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
11.08.2017, 14:57  [ТС] 17
OwenGlendower, Я и try/catch ставил =)
Как проверку сделать на этом примере?
0
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,342
Записей в блоге: 1
11.08.2017, 14:59 18
chaleureux, я уже показал как. Проверка обеспечивается путем try/catch и передачей true в метод DeleteSubKeyTree
0
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,259
11.08.2017, 15:08  [ТС] 19
Цитата Сообщение от OwenGlendower Посмотреть сообщение
я уже показал как. Проверка обеспечивается путем try/catch и передачей true в метод DeleteSubKeyTree
Прошу прощения =) за мою не внимательность.
0
11.08.2017, 15:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.08.2017, 15:08
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru