2

有人可以帮我解决我的问题。我有一个函数可以检查文件是否存在于特定路径中。该函数检查文件名是否匹配,路径是否也匹配。(具有特定名称的文件可能存在于多个位置)。请在下面找到我的代码。

memberPath 是一个包含相对路径的静态变量。file_Path 是一个静态变量,在找到匹配项时会更新。

我的问题是该函数找到了匹配项,但它脱离了 for 循环来返回语句,但又回到了 for 循环。有人可以帮我修复我的代码,以便一旦找到匹配项,它就会返回到调用位置。

public static String traverse(String path, String filename) {
        String filePath = null;
        File root = new File(path);
        File[] list = root.listFiles();

        for (File f : list) {
            if (f.isDirectory()) {
                traverse(f.getAbsolutePath(), filename);
            } else if (f.getName().equalsIgnoreCase(filename) && f.getAbsolutePath().endsWith(memberPath)) {
                filePath = f.getAbsolutePath();
                file_Path = filePath;
                break ;
                }
        }
        return filePath;
}
4

3 回答 3

6

添加 :

return traverse(f.getAbsolutePath(), filename);

返回您通过此调用获得的值。

正如所指出的 - 您可以返回值而不是中断。

于 2013-02-19T08:36:43.977 回答
3

递归的工作方式是函数调用自身。因此,当您的函数returns 时,它会返回 for 循环,因为它可能是外部函数(调用它的函数)从下面的行调用它

if (f.isDirectory()) {
            traverse(f.getAbsolutePath(), filename);

既然是这种情况,您需要在此处添加返回,正如 baraky 解释的那样,否则您将失去内部函数派生的答案。

于 2013-02-19T08:39:43.670 回答
1

正如 baraky、Karthik 和 JanDvorak 所指出的,更新后的代码是:

public String traverse(String path, String filename) {
        String filePath = null;
        File root = new File(path);
        File[] list = root.listFiles();

        for (File f : list) {
            if (f.isDirectory()) {
                return traverse(f.getAbsolutePath(), filename);
            } else if (f.getName().equalsIgnoreCase(filename)
                    && f.getAbsolutePath().endsWith(memberPath)) {
                filePath = f.getAbsolutePath();
                file_Path = filePath;
                return filePath;

                }
        }       
        return filePath;
    }

多谢你们!!

于 2013-02-19T09:13:52.433 回答