遍历整个目录树的文件和目录

Posted xuguoli_beyondboy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遍历整个目录树的文件和目录相关的知识,希望对你有一定的参考价值。

在开发中我们常常需要遍历整个目录树,这是我们写一个这样的工具类,以后就方便多了,这个类中可以通过使用local()方法产生由本地目录中的文件构成的File对象数组,或者通过使用walk()方法产生给定目录下的由整个目录树中所有文件构成的List.
代码例子:

//辅助打印的工具类
public class PPrint 
      public static String pformat(Collection<?> c) 
        if(c.size() == 0) return "[]";
        StringBuilder result = new StringBuilder("[");
        for(Object elem : c) 
          if(c.size() != 1)
            result.append("\\n  ");
          result.append(elem);
        
        if(c.size() != 1)
          result.append("\\n");
        result.append("]");
        return result.toString();
      
      public static void pprint(Collection<?> c) 
        System.out.println(pformat(c));
      
      public static void pprint(Object[] c) 
        System.out.println(pformat(Arrays.asList(c)));
      
    
    public final class Directory 
      public static File[]
    //返回当前目录下的文件
      local(File dir, final String regex) 
        return dir.listFiles(new FilenameFilter() 
          private Pattern pattern = Pattern.compile(regex);
          public boolean accept(File dir, String name) 
            return pattern.matcher(
              new File(name).getName()).matches();
          
        );
      
      public static File[]
      local(String path, final String regex)  // Overloaded
        return local(new File(path), regex);
      
      //返回一个二元组对象
      public static class TreeInfo implements Iterable<File> 
        public List<File> files = new ArrayList<File>();
        public List<File> dirs = new ArrayList<File>();
        public Iterator<File> iterator() 
          return files.iterator();
        
        void addAll(TreeInfo other) 
          files.addAll(other.files);
          dirs.addAll(other.dirs);
        
        public String toString() 
          return "dirs: " +PPrint.pformat(dirs) +
            "\\n\\nfiles: " + PPrint.pformat(files);
        
      
      //开始递归
      public static TreeInfo
      walk(String start, String regex)  
        return recurseDirs(new File(start), regex);
      
      //重载
      public static TreeInfo
      walk(File start, String regex)  
        return recurseDirs(start, regex);
      
      //递归当前目录任何文件或子目录
      public static TreeInfo walk(File start)  
        return recurseDirs(start, ".*");
      
    //递归当前目录任何文件或子目录
      public static TreeInfo walk(String start) 
        return recurseDirs(new File(start), ".*");
      
      static TreeInfo recurseDirs(File startDir, String regex)
        TreeInfo result = new TreeInfo();
        for(File item : startDir.listFiles()) 
          if(item.isDirectory()) 
            result.dirs.add(item);
            result.addAll(recurseDirs(item, regex));
           else // 返回当前目录任何文件或子目录
            if(item.getName().matches(regex))
              result.files.add(item);
        
        return result;
      
      public static void main(String[] args) 
        if(args.length == 0)
          System.out.println(walk("."));
        else
          for(String arg : args)
           System.out.println(walk(arg));
      
     

以上是关于遍历整个目录树的文件和目录的主要内容,如果未能解决你的问题,请参考以下文章

PHP脚本遍历目录/文件树并作为嵌套UL输出树[关闭]

JAVA文件目录遍历缩进算法

二叉树的前序中序和后续遍历及应用场景

java 如何递归遍历多重目录下的指定格式文件复制到目标目录并改格式

使用java递归方法遍历指定目录下所有子目录和子文件

如何逐步遍历目录树?