2015-07-01 33 views
0

我有一个方法需要String参数作为根目录,我想为所有子文件夹保存文件的名称和路径。将所有文件递归保存在一个列表中

FileObject只是一个类,有两个String变量 - namepath

private static List<FileObject> getAllFilePaths(String rootDir, List<FileObject> helper) { 
    File directory = new File(rootDir); 
    System.out.println("rootDir: "+rootDir); 
    FileObject fo=new FileObject(); 
    //get all files and directories 
    File[] allFiles = directory.listFiles(); 
    for (File file : allFiles) { 
     if (file.isFile()) { 
      System.out.println("If file: "+file.getName()); 
      //if it's a file add it to results 
      fo.setPath(file.getAbsolutePath()); 
      fo.setName(file.getName()); 
      helper.add(fo); 
     } else if (file.isDirectory()) { 
      System.out.println("else if: "+file.getName()); 
      //is it's a directory do the method again and add to to results 
      //fo.setPath(file.getAbsolutePath()); 
      //fo.setName(file.getName()); 
      //results.add(fo); 
      getAllFilePaths(file.getAbsolutePath(),helper); 
     } 
    } 
    return helper; 
} 

我尝试了许多不同的方式来实现此方法,但返回的列表是错误的。我如何正确地做到这一点?

+2

你需要多说“但返回的列表是错误的”。它可能有完全相同的'FileObject's(因为我没有看到你为每个正在处理的文件创建新的'FileObject'的任何地方)? – Pshemo

回答

3

您只创建一个FileObject的实例,并将其重复添加到列表中。尽管使用setter方法(如setName()setPath())来修改其属性,但这是而不是会给你你期望的结果。

Java在将对象添加到集合/数据结构时不复制对象。因此,通过调用for循环中的set...()方法,可以更改已添加到列表中的现有实例。

试试你的FileObject的实例移动到您的循环:

private static List<FileObject> getAllFilePaths(String rootDir, List<FileObject> helper) { 
    File directory = new File(rootDir); 
    System.out.println("rootDir: "+rootDir); 
    //get all files and directories 
    File[] allFiles = directory.listFiles(); 
    for (File file : allFiles) { 
     if (file.isFile()) { 
      System.out.println("If file: "+file.getName()); 
      //if it's a file add it to results 

      FileObject fo=new FileObject(); // < Instantiate the FileObject here 

      fo.setPath(file.getAbsolutePath()); 
      fo.setName(file.getName()); 
      helper.add(fo); 
     } else if (file.isDirectory()) { 
      System.out.println("else if: "+file.getName()); 
      //is it's a directory do the method again and add to to results 
      //fo.setPath(file.getAbsolutePath()); 
      //fo.setName(file.getName()); 
      //results.add(fo); 
      getAllFilePaths(file.getAbsolutePath(),helper); 
     } 
    } 
    return helper; 
} 
+2

或者简单地提供'FileObject'构造函数来接受'path'和'name',这样我们就可以写'helper.add(new FileObject(path,name))'。 – Pshemo

+1

@Pshemo同意 - 特别是如果'path'和'name'是_required_属性,对于'FileObject'类型肯定是这种情况。 –

+0

非常感谢!我会尝试并更新你! –

相关问题