Сначала разберитесь с простой рекурсивной функцией, такой как factorial
. Например:
int factorial(int number) {
if (number < 1)
return 1;
else
return factorial(number - 1) * number;
}
По сути, если мы хотим вычислить factorial(5)
, то это просто:
factorial(5) * factorial(4) * factorial (3) * factorial(2) * factorial(1)
или более абстрактно:
factorial(n) * factorial(n - 1) * factorial (n - 2) * ... * factorial (1)
Поэтому мы заставляем функцию вызывать саму себя с уменьшающимся значением для вычисления результата.
То же самое относится к вашей проблеме выше. Если мы хотим получить все подкаталоги, то все, что нам нужно сделать, это:
(1) List all the files in the current folder
(2) For the files that are directories, repeat step one.
Другими словами:
List<Folder> readAllFiles() {
List<Folder> folders = new List<Folder>();
readAllFilesRecursively("C:/", folders);
}
List<Folder> readAllFilesRecursively(String directory, List<Folder> folders) {
Folder currentDirectory = castTheStringToADirectorySomehow(directory);
// Add the current folder to the list.
folders.add(currentDirectory);
// ** HERE IS WHAT YOU'RE MISSING ** //
// Re-call the same function on the sub folder, passing in our list
// so that the subfolder items can be added to the list.
foreach (Folder subfolder in currentDirectory.subFolders()) {
readAllFilesRecursively(subFolder.pathString(), folders);
}
// Return the folder list.
return folders;
}
Редактировать:
Так что это работает для меня, но вам, очевидно, придется изменить его на VB. Кроме того, я на Mac, поэтому вы заметите, что формат пути немного отличается:
class Program {
public static void Main() {
List<FileInfo> files = new List<FileInfo> ();
AppendFilesFromDirectory (new DirectoryInfo("/Users/sircodesalot/Desktop/Dev"), files);
foreach (FileInfo file in files) {
Console.WriteLine (file.FullName);
}
}
public static void AppendFilesFromDirectory(DirectoryInfo currentFolder, List<FileInfo> files) {
foreach (FileInfo file in currentFolder.GetFiles()) {
files.Add(file);
}
// This if statement is unneccesary, but I'll add it for clarity
// to explain the concept of a base case. We don't really need it though
// since the 'foreach' statement won't execute if there aren't any items.
if (currentFolder.GetDirectories().Count() > 0) {
// Process the subfolders
foreach (DirectoryInfo subfolder in currentFolder.GetDirectories()) {
AppendFilesFromDirectory (subfolder, files);
}
}
}
}
person
sircodesalot
schedule
08.09.2014
My.Computer.FileSystem.GetDirectories
должно быть пустым, если вложенных папок нет, поэтому рекурсия должна остановиться. - person sircodesalot   schedule 08.09.2014My.Computer.FileSystem.GetDirectories
пусто», рекурсия все равно остановится. - person sircodesalot   schedule 08.09.2014