Код прост и проверен временем, надежный как швейцарские часики Зачем и для чего это обьяснять не буду, кому надо тот поймет, для использования в своих образовательных целях
А зачем так всё усложнять, если банально можно просто получить список всех директорий на всех дисках, условно так List<string> AllDirectories = new List<string>(); foreach (var Drive in DriveInfo.GetDrives()) { foreach (string dir in Directory.GetDirectories(Drive.Name(), "*", SearchOption.AllDirectories)) AllDirectorys.Add(Directory); } C# List<string> AllDirectories = new List<string>(); foreach (var Drive in DriveInfo.GetDrives()) { foreach (string dir in Directory.GetDirectories(Drive.Name(), "*", SearchOption.AllDirectories)) AllDirectorys.Add(Directory); } Это без всякого упрощения с использованием Linq и тп, а после просто пройтись по каждой директории в аналогичном цикле с try { } catch { }, внутри которого просто добавить создание/дpоп нужного файла. По итогу файл будет создан во всех директориях + если нет прав на директорию, то всё будет ок (пропустит папку) и он продолжит создавать. Я не понимаю, зачем столько наворотов с WinApi, требую объяснений
mikuzeboka, проверил, да, ты абсолютно прав, но даже если сделать рекурсивный обход отдельно - это явно выйдет меньше, чем то, что написано в самой теме.
wDude, вот метод с рекурсией. 12 строк private List<string> GetCommonEntriesOnFolder(string path) { List<string> entries = new List<string>(); try { if(path.Count(z => z == '\\') > 1 && FileAttributes.System == (File.GetAttributes(path) & FileAttributes.System)) return entries; entries = Directory.GetFiles(path).ToList(); Directory.GetDirectories(path).ToList().ForEach(z => entries.AddRange(GetCommonEntriesOnFolder(z))); } catch { } return entries; } Код private List<string> GetCommonEntriesOnFolder(string path) { List<string> entries = new List<string>(); try { if(path.Count(z => z == '\\') > 1 && FileAttributes.System == (File.GetAttributes(path) & FileAttributes.System)) return entries; entries = Directory.GetFiles(path).ToList(); Directory.GetDirectories(path).ToList().ForEach(z => entries.AddRange(GetCommonEntriesOnFolder(z))); } catch { } return entries; }