我猜我有一个(非常愚蠢的)问题。
我有两个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/abc
而f2
的路径为/storage/abcabc
会返回错误的true
。
答案 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。