Получить список файлов и папок

Есть код

                string[] rootDirs = Directory.GetDirectories(dir);
                string[] rootFiles = Directory.GetFiles(dir);

По-началу всё было волшебно. Но потом оказалось, что если поиск натыкается на файлы/папки, к которым нет доступа, то происходит экскепшен. Нафига ему доступ, чтобы просто прочитать имя? :japanese_goblin:
В интернете предлагают либо использовать монструозный код WinAPI, либо методы с try, которые не похоже что работают.
Однако,

тут код более простой и папка System Volume Information отображается :man_shrugging:
Но я не вижу строчки, осуществляющие поиск :thinking: И вообще, весь этот код выглядит как чёрная магия.

Почему не работают?

Так бывает, что и на чтение нет прав.

Еще есть такой вариант:
GitHub - AlexP11223/tree: C# implementation of unix-like tree command for listing contents of directories

ну вот например:

public static IEnumerable<string> GetFiles(string root, string searchPattern)
  {
    Stack<string> pending = new Stack<string>();
    pending.Push(root);
    while (pending.Count != 0)
    {
      var path = pending.Pop();
      string[] next = null;
      try
      {
        next = Directory.GetFiles(path, searchPattern);          
      }
      catch { }
      if(next != null && next.Length != 0)
        foreach (var file in next) yield return file;
      try
      {
        next = Directory.GetDirectories(path);
        foreach (var subdir in next) pending.Push(subdir);
      }
      catch { }
    }
  }

и

try
{
    string[] fileNames = Directory.GetFiles(sDir);
    // Do whatever you want with fileNames
}
catch (UnauthorizedAccessException)
{
    // Code here will be hit if access is denied. You can also
    // leave this empty to ignore the error.
}

и

foreach(string filePath in Directory.GetFiles(blah))
{
  try
  {
   //do something with file
  }
  catch(UnauthorizedAccessException ex)
  {
   //create an exception if needed (you can create a messageBox, or nothing)!
  }
}

разве будет работать? Последнее точно не будет.

Но ведь, например, на WinAPI (FindFirstFile() FindNextFile()) для чтения имени System Volume Information не нужны права :thinking: А тут они, внезапно, понадобились :man_shrugging:

А почему б не работать?

using System;
using System.IO;

namespace ConsoleApp8
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine(String.Join(Environment.NewLine, Directory.GetDirectories("C:/")));
            Console.WriteLine(String.Join(Environment.NewLine, Directory.GetFiles("C:/")));
            try
            {
                string[] fileNames = Directory.GetFiles("C:/System Volume Information");
            }
            catch (UnauthorizedAccessException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

чОрт! Похоже, я опять куда-то не туда посмотрел :man_facepalming:
Я, почему-то, был уверен, что экскепшен возникает уже на GetDirectories() и GetFiles() :thinking: С чего я это взял и как так получилось, я вообще хз :man_shrugging:

Постойте-ка! :thinking: Слушайте! :slightly_smiling_face: А чё за хрень? :dizzy_face:
Вернул как было вчера (без try):


            void ParseDir(string dir, ListItem rootItem)
            {
                string[] rootDirs = Directory.GetDirectories(dir);
                string[] rootFiles = Directory.GetFiles(dir);

                foreach (string subDir in rootDirs)
                {
                    string subDirName = Path.GetFileName(subDir);
                    ListItem item = new ListItem(subDirName, ListItemType.Directory, rootItem);
                    //try
                    //{
                        DirectoryInfo directoryInfo = new DirectoryInfo(subDir);
                        item.DateCreated = directoryInfo.CreationTime;
                        item.DateModified = directoryInfo.LastWriteTime;
                        item.AttributesString = AttributesToString(directoryInfo.Attributes);
                        ParseDir(subDir, item);
                    /*}
                    catch (UnauthorizedAccessException ex)
                    {
                        System.Diagnostics.Debug.WriteLine(ex.Message);
                    }*/
                    rootItem.Children.Add(item);
                }

                int iter = 0;
                foreach (string file in rootFiles)
                {
                    if (iter++ % 15 == 0)
                    {
                        lblDateModified.Text = $"Сканирование: {file}";
                        Application.DoEvents();
                    }
                    string fileName = Path.GetFileName(file);
                    ListItem item = new ListItem(fileName, ListItemType.File, rootItem);
                    //try
                    //{
                        FileInfo fileInfo = new FileInfo(file);
                        item.Size = fileInfo.Length;
                        item.DateCreated = fileInfo.CreationTime;
                        item.DateModified = fileInfo.LastWriteTime;
                        item.AttributesString = AttributesToString(fileInfo.Attributes);
                        displayName = $"{fileName} [{item.Size}] [{item.AttributesString}]";
                        item.DisplayName = displayName;
                    /*}
                    catch (UnauthorizedAccessException ex)
                    {
                        System.Diagnostics.Debug.WriteLine(ex.Message);
                    }*/
                    rootItem.Children.Add(item);
                }
            }
        }

Дебаггер показывает именно на строчку string[] rootDirs = Directory.GetDirectories(dir);
а, всё, дошло как до жирафа :man_facepalming: Как можно так тупить? :man_facepalming: :man_facepalming: :man_facepalming: