大家好,小弟欲使用递归对某目录进行搜索,找到需要的文件,如果递归函没有返回值,只是打印出一些信息,那是没问题的,但是如果作为函数返回值进行返回,则出现问题,如下代码:    // dir表示目录路径,name表示欲匹配的文件名的正则表达式
    private File getFile(String dir, String name) {
        File[] files = new File(dir).listFiles();
        int len = files.length;
        for (int i = len-1; i >= 0; i--) {
            if (files[i].isDirectory()) {
                // 当前访问文件为目录,则递归
                return getFileStrByRegex(files[i].getAbsolutePath(), regName);
            } else if (files[i].getName().matches(regName)) {
                // 找到,返回
                return files[i];
            } else {
                // 当前访问文件为真实文件,而非目录,但又不是符合条件的
                // 这里要怎么写?当然可以什么都不写,那就请看最后一句return null;的注释
            }
        }
        // 这句话一执行,无论当前递归到哪一层,整个函数都会结束并返回null,但是如果这句没有,则由于函数有返回值,会报语法错误
        return null;
    }问:如何以递归的方式返回文件(注意需要返回值)?还有,我测试了一下,发现return和return null是不一样的,前者只会返回当前层的递归,而后者则所有层都返回,即整个递归过程结束。请指教,谢谢,谢谢~~

解决方案 »

  1.   

    递归目录不需要返回值。
    我这是C#的递归目录,跟Java应该差不多。在外面声明一个ArrayList来接public ArrayList al=new ArrayList();
    //我把ArrayList当成动态数组用,非常好用
    public void GetAllDirList(string strBaseDir)
    {
      DirectoryInfo di=new DirectoryInfo(strBaseDir);
      DirectoryInfo[] diA=di.GetDirectories();
      for(int i=0;i<diA.Length;i++)  {
       al.Add(diA[i].FullName);
      //diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中
       GetAllDirList(diA[i].FullName);
      //注意:递归了。逻辑思维正常的人应该能反应过来
      }
    }
      

  2.   

    定义一个全局变量,存储搜索结果就可以了List<File> list = new ArrayList<File>();
      

  3.   


        // dir表示目录路径,name表示欲匹配的文件名的正则表达式
        private File getFile(String dir, String name) {
            File[] files = new File(dir).listFiles();
            File file= null;
            int len = files.length;
            for (int i = len-1; i >= 0; i--) {
                if (files[i].isDirectory()) {
                    // 当前访问文件为目录,则递归
                 System.out.println("目录为 :" + files[i].getAbsolutePath());
                    getFile(files[i].getAbsolutePath(),name);
                } else if (files[i].getName().matches(name)) {
                    // 找到,返回
                 file = files[i];
                 break;
                } else {
                 System.out.println("不符合文件 :" + files[i].getName());
                    // 当前访问文件为真实文件,而非目录,但又不是符合条件的
                    // 这里要怎么写?当然可以什么都不写,那就请看最后一句return null;的注释
                }
            }
            // 这句话一执行,无论当前递归到哪一层,整个函数都会结束并返回null,但是如果这句没有,则由于函数有返回值,会报语法错误
            return file;
        }
    你要的可能是这个效果吧
    递归是函数自身调用自身。。
      

  4.   

    else if (files[i].getName().matches(regName)) {
                    // 找到,返回
                    return files[i];
    很简单,你在找到第一个文件的时候就不再调用递归方法了,递归就终止了呀!
      

  5.   


    对,这是毫无疑问的,可是我没找到文件时就返回了,因为执行了return null