如何检查一个文件是否在另一个文件中?

时间:2015-03-29 10:27:38

标签: java file

我猜我有一个(非常愚蠢的)问题。

我有两个File类,如果一个在另一个内,我想返回true。如果没有,则为假。我无法比较父文件,因为/a/b/c/d也是/a/b的子文件夹。

我的第一种方法是这样的:

boolean areSubsets(File f1, File f2) {
    if (f1.getAbsolutePath().contains(f2.getAbsolutePath()) ||
            f2.getAbsolutePath().contains(f1.getAbsolutePath()) {
        return true;
    } else {
        return false;
    }
}

但问题是这种方式存在误报。

即如果我们f1的路径= /storage/abcf2的路径为/storage/abcabc

会返回错误的true

3 个答案:

答案 0 :(得分:3)

您可以分为/

boolean areSubsets(File f1, File f2) throws IOException {
    String[] p = f1.getCanonicalPath().split("/");
    String[] q = f2.getCanonicalPath().split("/");
    for (int i = 0; i < p.length && i < q.length; i++)
        if (!p[i].equals(q[i]))
            return false;
    return true;
}

根据fge的评论,在Java 7中,您可以执行以下操作:

boolean areSubsets(File f1, File f2) {
    Path path1 = f1.toPath();
    Path path2 = f2.toPath();
    return path1.startsWith(path2) || path2.startsWith(path1);
}

答案 1 :(得分:1)

一种简单的方法是在路径上使用startsWith(),但在“容器”中添加斜杠:

File f1, f2;

boolean contains = f2.getCanonicalPath().startsWith(
    f1.getCanonicalPath() + "/");

答案 2 :(得分:1)

如果您使用Java 7 +解决方案:

final Path testedPath = Paths.get(...).toAbsolutePath();
final Path candidateParent = Paths.get(...).toAbsolutePath();

return testedPath.startsWith(candidateParent)
    && !testedPath.equals(candidateParent);

请注意,有.toRealPath(),但它可以抛出IOException。