Reputation: 230048
Java 7 introduced java.nio.file.Path as a possible replacement for java.io.File.
With File, when I access a file under a specific, I would do:
File parent = new File("c:\\tmp");
File child = new File(parent, "child"); // this accesses c:\tmp\child
What's the way to do this with Path?
I supposed this will work:
Path parent = Paths.get("c:\\tmp");
Path child = Paths.get(parent.toString(), "child");
But calling parent.toString()
seems ugly. Is there a better way?
Upvotes: 75
Views: 30592
Reputation: 4470
To anyone finding this question looking specifically only for files that are within the specified path, you must be aware of path traversal attacks.
See: Filtering upwards path traversal in Java (or Scala)
It is critical that you check that the path starts with the root.
Path parent = Paths.get("C:\\tmp");
Path child = parent.resolve("chlid").normalize();
if (!child.startsWith(parent)) {
throw new IllegalArgumentException("Potential Path Traversal Attack");
}
Upvotes: 0
Reputation: 33078
Use the resolve
method on Path
.
There are two methods with this name. One takes a relative Path
and the other a String
. It uses the Path
on which it is called as a parent and appends the String
or relative Path
appropriately.
Path parent = Paths.get("c:\\tmp");
Path child = parent.resolve("child");
Upvotes: 109