在目录中查找文件并返回其完整路径和文件名

时间:2014-09-26 05:14:43

标签: java loops recursion

这应该很容易。这个问题(Java - Search for files in a directory)似乎占据了我需要的99%,但缺少1%是真正的SOB。

我需要在目录中找到特定文件,并将完整路径和文件名作为字符串返回。如果有多个匹配文件,那很好,我只需要第一个匹配。

下面的代码工作,因为它将递归遍历目录结构并返回所有匹配 - 当我将sysout放入方法的各个部分时,我可以看到它发生 - 但我不能为我的生活当它找到匹配时让它停止并返回匹配的值。

我尝试用一​​个WHILE语句替换FOR语句,该语句由foundfile变量的值以及其他六种方法控制,但它们都归结为同一个结尾;当我找到匹配的文件并将其设置为“else if”子句中的foundfile变量时,for循环只是继续迭代并在下一个循环中用“”值覆盖foundfile变量的值。我原本以为从“if else”子句中调用setOutput方法会成功设置值,直到列表数组为空,但显然不是。

显然,有一些关于递归和参数的持久性,我从根本上误解了。有人可以照亮吗?

package app;

import java.io.*;
import java.util.*;

class FindFile {

    public String setOutput(String name, File file, String fileloc) {
        String foundfile = fileloc;
        File[] list = file.listFiles();
        if (list != null)
            for (File fil : list) {
                if (fil.isDirectory()) {
                    setOutput(name, fil, foundfile);

                } else if (fil.getName().contains(name)) {
                    foundfile = (fil.getParentFile() + "\\" + fil.getName());
                    setOutput(name, fil, foundfile);
                }
            }

        return foundfile;

    }

    public static void main(String[] args) {
        FindFile ff = new FindFile();
        String thisstring = ff.setOutput(".jar", new File("/Temp/df384b41-198d-4fee-8704-70952d28cbde"), "");

        System.out.println("output: " + thisstring);

    }
}

1 个答案:

答案 0 :(得分:4)

您可以在找到文件路径时返回该文件路径。如果您只对第一场比赛感兴趣,则无需检查其他文件:

这是一个例子(未经测试):

public String setOutput(String name, File file) {
    File[] list = file.listFiles();
    if (list != null) {
        for (File fil : list) {
            String path = null;
            if (fil.isDirectory()) {
                path = setOutput(name, fil);
                if (path != null) {
                    return path;
                }
            } else if (fil.getName().contains(name)) {
                path =fil.getAbsolutePath();
                if (path != null) {
                    return path;
                }
            }
        }
    }
    return null; // nothing found
}