陌生的路径是否会导致文件系统结构错误?

3
考虑以下例子:
//both files are the same
final File path = new File("/home/alice/../bob/file.txt");
final File canonicalPath = new File("/home/bob/file.txt");

File parent = canonicalPath;
while((parent = parent.getParentFile()) != null) {
    System.out.println(parent.getName());
}

这将打印:

bob
home

如果我使用 path 而不是 canonicalPath,输出结果会相同吗?还是会有所不同?
bob
home
alice
home

这将会非常奇怪,因为它会暗示alicehome的父级,而这是不正确的。


你的代码是否编译成功并真的输出了 bob 和 home?惊喜!!! - SMA
你可能需要修复你的例子。即使没有错误的 final parent,循环也是无限的。 - Sotirios Delimanolis
@SotiriosDelimanolis 哦,是的谢谢 xD 我会修复它 - MinecraftShamrock
你为什么要使用File而不是新的java.nio.file API? - fge
通过您目前的示例,我无法得到path的输出。 - Sotirios Delimanolis
2个回答

2
首先,我想你想比较的是没有起始斜杠/home/alice/../bob/file.txt而不是/home/alice/../bob/file.txt,否则你会拿苹果和橙子做比较。
实际上,使用以下代码比较差异更有趣:
    File parent;

    parent = path;
    while((parent = parent.getParentFile()) != null) {
        System.out.println(parent);
    }

    parent = canonicalPath;
    while((parent = parent.getParentFile()) != null) {
        System.out.println(parent);
    }

"home/alice/../bob/file.txt"的父目录:

  • "home/alice/../bob"
  • "home/alice/.."
  • "home/alice"
  • "home"
  • null

相比之下,"home/bob/file.txt"的父目录为:

  • "home/bob"
  • "home"
  • null

非常感谢。我无法自己尝试,因为我目前在使用手机。 - MinecraftShamrock

1
由于这是两个不同的文件系统路径,因此结果将不同。
但是请改用Path
final Path path = Paths.get("/home/bob/../alice/somefile");

final Path normalized  = path.normalize(); // /home/alice/somefile

path.toAbsolutePath(); // get an absolute path
path.toRealPath();     // same, but follows symlinks

// etc etc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接