2017-03-07 1 views
0

J'essaye de créer une petite application qui utilise le marcheur de fichiers pour lire récursivement le contenu de l'endroit spécifié du système de fichiers. J'ai ce code:Pourquoi la liste reste inchangée?

/* Imports here */ 

public class App { 

    private static Scanner inp; 
    public static List<Node> Tree = new ArrayList<Node>(); 

    public static void main(String[] args) { 
     String FFiles; 

     System.out.print("Enter root directory: "); 
     inp = new Scanner(System.in); 

     FileSystem fileSystem = FileSystems.getDefault(); 
     Path rootPath = fileSystem.getPath(inp.nextLine()); 

     FileVisitor<Path> simpleFileVisitor = new SimpleFileVisitor<Path>() { 
       public Path VisitedDirectory = rootPath; 
       public List<Node> files = new ArrayList<Node>(); 


       @Override 
       public FileVisitResult preVisitDirectory(Path dir,BasicFileAttributes attrs) throws IOException { 
       if (dir != VisitedDirectory) { 
        Node directory = new Node(dir.getFileName().toString(), "directory", files, dir.toString()); 
        files.add(directory); 
        Node VisDirectory = new Node(VisitedDirectory.getFileName().toString(), "directory", files, dir.toString()); 
        Tree.add(VisDirectory); 

        files.clear(); 
       } 
       return FileVisitResult.CONTINUE; 
       } 

       @Override 
       public FileVisitResult visitFile(Path visitedFile,BasicFileAttributes fileAttributes) throws IOException { 
       Node file = new Node(visitedFile.getFileName().toString(), "file", null, visitedFile.toString()); 
       files.add(file); 
       return FileVisitResult.CONTINUE; 
       } 
     }; 



     try { 
      Files.walkFileTree(rootPath, simpleFileVisitor); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 

     for (Node n : Tree) { 
      System.out.println(n); 
     } 
    } 

Et voici la question: Pourquoi il lit uniquement les répertoires? P.S classe Node est juste un couple de variables et déclaré comme ceci:

public class Node { 
    @Override 
    public String toString() { 
     return "Node [path=" + path + "]"; 
    } 

    public String name; 
    public String path; 
    public String type; 
    public List<Node> children = new ArrayList<Node>(); 
    public Node(String name, String type, List<Node> children, String path) { 
     this.name = name; 
     this.type = type; 
     this.children = children; 
     this.path = path; 
    } 
} 
+0

Placez un point d'arrêt dans la méthode visitFile. Vérifiez si l'exécution l'atteint. Aussi dans dir dir vous ajoutez à la liste des arbres. Dans le fichier de visite, vous ne le faites pas – efekctive

Répondre

0

Votre font un grand désordre avec la liste files. Vous ne créez jamais qu'une seule instance. Ainsi, votre new Node(VisitedDirectory.getFileName().toString(), "directory", files, dir.toString()) ne copie pas réellement la liste de fichiers mais stocke simplement une référence. Votre appel files.clear() effacera toutes les listes de fichiers que vous avez. C'est pourquoi seuls les nœuds que vous ajoutez à Tree survivront un jour.

Et renommez Tree en minuscules. De cette façon, on pense Tree.add() invoque une méthode statique sur la classe Tree.