Forum

Пожалуйста or Регистрация для создания сообщений и тем.

Как после удаления элемента в listbox, удалить ключ в реестре? [Решено]

Здравствуйте, помогите с кодом:

void conbutton_Click(object sender, EventArgs e)
{
   string[] files = new string[50];

   try
   {
       files = Registry.ClassesRoot.OpenSubKey(@"*\shell\").GetSubKeyNames();
   }
   catch { }
   
   for (int i = 0; i < files.Length; i++)
   {
       try
       {
           contentlist.Items.Add(files[i]);
       }
       catch { }
   }

Кнопкой "conbutton", я создаю элементы в listbox (contentlist), контекстного меню из реестра
Также, у меня есть кнопка для удаления элементов оттуда (button2)
Однако, удаляется только элемент, но нужно еще и ключ реестра снести(((

 void button2_Click(object sender, EventArgs e)
{
     if (contentlist.SelectedItem != null)
     {
         RegistryKey path = Registry.ClassesRoot.OpenSubKey($@"{files}");

         try
         {
             contentlist.Items.Remove(contentlist.SelectedItem);
             path.DeleteSubKey($@"{path}");
             path.Close();


         }
         catch { reportlabel.Text = "regedit key isn't delete"; }
        
        contentlist.Items.Remove(contentlist.SelectedItem);
     }

Перебрал кучу вариантов, на форумах не нашел ответа. Помогите решить проблему, пожалуйста.

Добрый🖐.
DeleteSubKeyTree?

Если я правильно понял DeleteSubKey заменить на DeleteSubKeyTree, не меняет ситуацию

А так СкопированоRegistryKey path = Registry.СкопированоClassesRoot.OpenSubKey($@"{files}", true);
СкопированоDeleteSubKeyTree так и оставить.

Приветствую 🖐

В этой строке ошибка: СкопированоRegistryKey path = Registry.ClassesRoot.OpenSubKey($@"{files}");
✓ files – это массив ключей, а открываться должен 1 конкретный ключ.
Вы туда вставляете весь массив.


В коде ниже не нужны ни Скопированоfor ни Скопированоtry catch:

for (int i = 0; i < files.Length; i++)
{
  try
  {
    contentlist.Items.Add(files[i]);
  }
  catch { }
}

Предлагаю переписать событие первой кнопки Скопированоconbutton так:

var files = new List<string>();

using (var key = Registry.ClassesRoot.OpenSubKey(@"*\shell\"))
    files = key.GetSubKeyNames().ToList();

files.ForEach(x => contentlist.Items.Add(x));

✓ Далее во второй кнопке Скопированоbutton2 бессмысленно повторяется Скопированоcontentlist.Items.Remove(contentlist.SelectedItem);
✓ Также не нужно оборачивать в Скопированоtry catch то, что не упадёт. Говорил про try catch – берегите память и не злоупотребляйте.
✓ Также у Вас не закрывается открываемая ветка. Именно поэтому в уроках говорил привыкать к Скопированоusing.
✓ И если мы собираемся что-то добавлять / изменять / удалять из ветки, которую открываем, не забываем дописывать Скопированоtrue внутри СкопированоOpenSubkey, иначе получим ошибку неавторизованного доступа к разделу реестра.


Код для второй кнопки Скопированоbutton2:

var item = contentlist.SelectedItem;
if (item != null)
{
    using (RegistryKey path = Registry.ClassesRoot.OpenSubKey($@"*\shell\{item}", true))
    {
        try
        {
            path.DeleteSubKeyTree("");
            contentlist.Items.Remove(item);
        }
        catch
        {
            reportlabel.Text = "Failed to delete registry key";
        }
    }
}
Удаленный пользователь, Удаленный пользователь и Удаленный пользователь отреагировали на эту запись.
Удаленный пользовательУдаленный пользовательУдаленный пользователь

Христ, спасибо Вам большое! Пишу код только неделю, прыгаю выше головы, поэтому так криво, теперь работает!

Удаленный пользователь отреагировал на эту запись.
Удаленный пользователь

Я бы, конечно, рекомендовал посмотреть как минимум первые 20 уроков. Это просто маст-хэв.
После этого более наглядные и посложнее следующие 20 уроков. Ещё 30 уроков, которые вышли в этом году можно уже с перерывами. Но вот первые 20 + 20 просто обязательно, иначе много мучиться придётся и исправлять постоянно 😉