// Hunter Schafer, CSE 143 // This program prints out the structure of a given directory or file import java.io.*; import java.util.*; public class DirectoryCrawler { public static void main(String[] args) { Scanner console = new Scanner(System.in); System.out.print("directory or file name? "); String name = console.nextLine(); File f = new File(name); if (!f.exists()) { System.out.println("That file or directory does not exist"); } else { print(f); } } // prints the name of the file // if the file is a directory, prints its children in the same format private static void print(File file) { if (!file.isDirectory()) { System.out.println(file.getName()); } else { System.out.println(file.getName()); // print all the children of file File[] subFiles = file.listFiles(); for (for int i = 0; i < subFiles.length; i++) { print(subFiles[i]); } } } /**************************************************************************************** * Below is an iterative version of this solution (that also adds spacing to output) * * Note how much extra work is necessary in order to not use recursion here! * * You should not try to write code like this! * ****************************************************************************************/ public static void printIterative(File file) { System.out.println(file.getName()); if (file.isDirectory()) { Stack> toProcess = new Stack<>(); toProcess.push(children(file)); while (!toProcess.isEmpty()) { Queue subFilesQueue = toProcess.peek(); if (subFilesQueue.isEmpty()) { toProcess.pop(); } else { File nextFile = subFilesQueue.remove(); for (int i = 0; i < toProcess.size(); i++) { System.out.print(" "); } System.out.println(nextFile.getName()); if (nextFile.isDirectory()) { toProcess.push(children(nextFile)); } } } } } private static Queue children(File file) { File[] subFiles = file.listFiles(); Queue subFilesQueue = new LinkedList<>(); for (File subFile : subFiles) { subFilesQueue.add(subFile); } return subFilesQueue; } }