@iluxa1810

Как быстро обойти директории и получить файловое дерево?

Имеет ли смысл использовать параллелизм? Некоторые говорят, что параллелизм бредово использовать для таких целей.
В C# конечно есть готовое решение в виде Directory.EnumerateFiles, но если возникнут какие-то проблемы(Например, прав не будет),то я вообще не получу каких-либо элементов коллекции и поэтому, я думаю, что нужно ручками обходить.
  • Вопрос задан
  • 336 просмотров
Пригласить эксперта
Ответы на вопрос 2
yarosroman
@yarosroman
C# the best
может есть смысл получать содержимое каталога по запросу, при обращении к коллекции, а зачем дерево нужно?
Ответ написан
Комментировать
Protos
@Protos
Спрашивай - отвечу
Используйте рекурсию.
Правда быстрый код я писать не умею. Если у вас прав недостаточно, тогда ищите уязвимости windows.
Из кода ниже вам будет интересна переменная List<string> filesanddirecoties;
List<string> filesanddirecoties;
        DirectoryInfo[] files;
        void WalkDirectoryTree(string RootDirectory)
        {
            richTextBox1.Clear();
            DirectoryInfo root = new DirectoryInfo(RootDirectory);
            if (root.Exists)
            {
                try
                {
                    filesanddirecoties = new List<string>();
                    DirectoryInfo[] subDirs = root.GetDirectories();
                    AuthorizationRuleCollection ACLs = root.GetAccessControl().GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));
                    string rules = "";
                    string[] Tree = root.FullName.Split('\\');

                    for (int i = 0; i < Tree.Length; i++)
                    {
                        filesanddirecoties.Add(Tree[i]);
                        string[] files = Directory.GetFiles(RootDirectory);
                        for (int j = 0; j < files.Length; j++)
                        {
                            if(files.Length!=0)
                                filesanddirecoties.Add(files[j]);
                        }
                    }
                    //получаем права на папку
                    /*foreach (FileSystemAccessRule ACL in ACLs)
                    {
                        if (!IsSystemRules(ACL.IdentityReference.ToString()))
                        {
                            for (int i = 0; i < Tree.Length - 2; i++)
                                rules += "\t";
                            rules += ACL.IdentityReference;

                            if (ACL.AccessControlType.ToString().Equals("Allow"))
                            {
                                rules += ", разрешено: " + ACL.FileSystemRights + Environment.NewLine;
                            }
                            else if (ACL.AccessControlType.ToString().Equals("Deny"))
                            {
                                rules += ", запрещено: " + ACL.FileSystemRights + Environment.NewLine;
                            }
                        }
                    }*/
                    for (int i = 0; i < Tree.Length - 2; i++)
                        richTextBox1.Text += "\t";
                    richTextBox1.Text += RootDirectory + Environment.NewLine + rules + Environment.NewLine;

                    if (Tree.Length < (Convert.ToInt32(textBox2.Text) + 1))
                        foreach (DirectoryInfo dirInfo in subDirs)
                            WalkDirectoryTree(dirInfo.FullName);
                }
                catch (UnauthorizedAccessException ee)
                {
                    richTextBox1.Text += RootDirectory + Environment.NewLine;
                }
            }
            else { richTextBox1.Text = "Папка не существует. Отмена операции."; }
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы