Печать всего содержимого дерева LocalMachine - PullRequest
0 голосов
/ 18 октября 2011

Я пытаюсь разработать программу на c # для вывода всего дерева LocalMachine на консоль. До сих пор я только что смог получить подразделы HKEY_LOCAL_MACHINE, но не более того. Я относительно уверен, что мне нужно использовать какую-то рекурсию здесь, чтобы получить все содержимое подразделов и их подразделов и так далее. Я просто не знаю, как это сделать. Вот что у меня есть сейчас:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;

namespace PrintLocalMachine
{
    class PrintLocalMachine
    {
        static void Main(string[] args)
        {
            Console.Out.WriteLine(Registry.LocalMachine.Name);
            string[] subkeynames = Registry.LocalMachine.GetSubKeyNames();            

            foreach (string subkey in subkeynames)
            {
                try
                {
                    RegistryKey rk = Registry.LocalMachine.OpenSubKey(subkey);
                    Console.Out.WriteLine(rk.Name);

                    string[] subkeynames2 = rk.GetSubKeyNames();

                    foreach (string s in subkeynames2)
                    {
                        recurse(s, rk);
                    }
                }
                catch (Exception e) { }
            }
        }

        private static void recurse(string sub, RegistryKey rk)
        {
            RegistryKey rk2 = Registry.LocalMachine.OpenSubKey(sub);
            Console.Out.WriteLine(rk2.Name);

            string[] subkeynames3 = rk.GetSubKeyNames();

            foreach(string s2 in subkeynames3){
                recurse(s2, rk2);
            }
        }
    }
}

Может ли кто-нибудь объяснить, как мне поступить? Мне просто нужно указать в правильном направлении, я просто ударился об стену с этим.

РЕДАКТИРОВАТЬ: я немного изменил и обновил код; обновленный код висит на HKEY_CURRENT_MACHINE \ SAM, просто печатая его снова и снова, пока StackOverflowException

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

recurse () не является рекурсией , если только она сама себя не вызывает.Переместите весь свой код из main в recurse () и вызовите recurse () из main.Вы также можете закрыть открытые подразделы.

0 голосов
/ 18 октября 2011

Вы правы. Такую проблему, когда у вас есть структура внутри структуры, можно решить с помощью рекурсии. Вам нужно написать рекурсивную функцию, то есть функцию, которая вызывает себя до тех пор, пока не будет выполнено определенное условие. В этом случае это условие будет следующим: если у ключа реестра есть хотя бы один дочерний элемент, нам нужно войти внутрь этого ключа реестра, и мы будем продолжать это делать, пока не достигнем конечного узла, то есть ключа реестра, у которого больше нет дочерних элементов.

 private static void Main(string[] args)
    {

        string[] subkeynames = Registry.LocalMachine.GetSubKeyNames();
        Console.Out.WriteLine(Registry.LocalMachine.Name);

        foreach (string subkey in subkeynames)
        {
            try
            {
                //this might raise a security exception
                RegistryKey rk = Registry.LocalMachine.OpenSubKey(subkey);
                recurse(rk);
                rk.Close();
            }
            catch (Exception e)
            {
                Console.Write("Couldnt access key : " + subkey + "\n " + e.ToString());
            }
        }

        Console.ReadKey();
    }

    private static void recurse(RegistryKey rk)
    {
        Console.WriteLine(rk.Name);
        string[] subkeys = rk.GetSubKeyNames();

        if (null != subkeys && subkeys.Count() > 0)
        {
            foreach (var subkey in subkeys)
            {
                try
                {
                    //this might raise a security exception
                    RegistryKey key = rk.OpenSubKey(subkey);
                    recurse(key);
                }
                catch (Exception e)
                {
                    Console.Write("Couldnt access key : " + subkey + "\n " + e.ToString());
                }

            }
        }
    }
...