[DSA] Домашно Trees and Traversals - 2 Задача - TraverseDirectory


3

2. Write a program to traverse the directory C:\WINDOWS and all its subdirectories recursively and to display all files matching the mask *.exe. Use the class System.IO.Directory.

Source - цък

Задачата я реших с рекурсия, като използвах два метода от класа Sysmte.IO.Directory. Единия метод връща масив от стрингове с пътища на файловете в дадена директория, а другия метод връща масив от стрингове с пътища на директориите в дадена директория.

Първоначално, чрез метода TraverseDirectory обхождам главната директория и добавям в една глобална променлива всички пътища на файлове, които търся. След това с един foreach цикъл изпълнявам същия метод, като вече не обхождам главната директория, ами вътрешните директории (рекурсивно). 

Тъй като ми е първа рекурсия и не съм сигурен дали съм се справил, ще се радвам, ако получа някакви съвети.




Отговори



3

А принципно нямаш ли проблеми при достъпване на някой от фаловете ? Като UnauthorizedAccessException :) ? При мен го имаше точно този проблем и имам допълнително прихващане на грешката :)

Btw търсиш *.dll - и, да не забравиш да го смениш на exe-та :)

Ето моята реализация:

GitHub


от Teodor92 (13062 точки)


0
Да, но мисля, че идеята на задачата е да се научим да обхождаме директории. Като се прибера ще се пробвам пак с WINDOWS директорията.

от SVGN_H (3048 точки)

0
Да да, напълно съгласен, просто му беше интересно дали е само при мен проблема с достъпа :D

от Teodor92 (13062 точки)



5

Като се ползва функцията Directory.GetFiles() може да се подаде като параметър дали желаеш да се обходят и поддиректориите на началната директория, което спестява код. Ползва се SearchOption.AllDirectories като трети параметър -

Directory.GetFiles(startDirectory, fileExtension, SearchOption.AllDirectories);


от nikostov (202 точки)


2

С помощ от примерите в msdn , ето и решението


от plamentsokov (105 точки)


0
Не ти ли е много бавно да печаташ на конзолата всяка команда по отделно? За колко време обхождаш C:\\Windows?

от VGeorgiev (2890 точки)


2

Решение: Github

Решението е в метода ShowExeFiles..

1. Взимам файловете в подадената на метода директория.

2. Изпечатвам ги.

3. Взимам директориите в подадената на метода директори.

4. Пускам да ми покаже файловете за всяка папка в текущата директория.

Всичко това правя в един try-catch, защото има директроии, за които нямам достъп.

Ползвам EnumerateDirectories, защото според Benchmark-a на dotnetperls, е малко по-бърз при повече файлове от GetFiles.


от kirov (4821 точки)


3

Една доста полезна статия . Тук!. Описан е стъпка по стъпка алгоритъма по-който трябва да се случи обхождането, заедно с необходимите методи! :)


от boncho.vylkov (1923 точки)


1

Здравейте,

Ето го и моето решение

Различното е, че реших да потренирам малко и да го направя в опашка.

Пазя три колекции - директории, изпълними файлове, грешки и накрая ги листвам.

И при мен изникна проблемът с достъпа до директориите. За това ползвам try catch. Съобщението на грешката е достатъчно Human Readable, затова реших да не го предефинирам.

Ще се радвам на всякакви препоръки и съвети. 

Поздрави!


от nikolaikolarov (2177 точки)


2

Решение.
По зададени startingDirectory = "C:\\windows" и fileExtension = "*.exe"; извиквам рекурсивно TraverseDirectories метод за обхождане на дървото на windows, като записвам намерените файлове в searchedFiles
В метода TraverseDirectories използвам методите Directory.GetFiles и Directory.GetDirectories.
Целия метод е try catch блог защото има папки до които програма няма достъп.


от AsenVal (3487 точки)


1

Решение

В един глобален HashSet<string> си запазвам всеки файл, който завършва със .ехе

В DFS метода проверявам първо всеки файл от текущата папка и после викам същия метод за всяка една под-папка на текущата.

Накрая със string.Join отпечатвам всички елементи на HashSet-а

 


от dzhenko (3893 точки)


0

Ето и моето решение, напълно вдъхновено от статията в MSDN тук

За мен лично беше интересно, че като претърсих директорията TelerikAcademy за *.cs файлове резултата беше ~1700 файла :)


от wnvko (3123 точки)


0

Ето така съм го направил аз (по два на чина един вид), опитах се да хвана някакви exception-и, но естествено не мога да се сетя за всичките неща които могат да гръмнат :)


от dimo.petrof (2887 точки)