Reputation: 3086
I have a file path like this:
/home/Dara/Desktop/foo/bar/baz/qux/file.txt
In Java, I would like to be able to get the top two folders. Ie. baz/qux
regardless of file path length or operating system (File path separators such as /
:
and \
). I have tried to use the subpath()
method in Paths
but I can't seem to find a generic way to get the length of the file path.
Upvotes: 11
Views: 17667
Reputation: 3786
To get path parts in Koltin
fun subPaths(path: Path, levels: Int): List<Path> {
return path.runningReduce { acc, value -> acc.resolve(value) }.take(levels)
}
Upvotes: 1
Reputation: 2791
Using subpath and getNameCount.
Path myPath = Paths.get("/home/Dara/Desktop/foo/bar/baz/qux/file.txt");
Path subPath = myPath.subpath(myPath.getNameCount() -3, myPath.getNameCount() -1);
Upvotes: 4
Reputation: 21224
Not yet pretty, however, you guess the direction:
File parent = file.getParentFile();
File parent2 = parent.getParentFile();
parent2.getName() + System.getProperty("path.separator") + parent.getName()
Another option:
final int len = path.getNameCount();
path.subpath(len - 3, len - 1)
Edit: You should either check len or catch the IllegalArgumentException
to make your code more robust.
Upvotes: 13
Reputation: 674
The methods getNameCount()
and getName(int index)
of java.nio.Path
should help you:
File f = new File("/home/Dara/Desktop/foo/bar/baz/qux/file.txt");
Path p = f.toPath();
int pathElements = p.getNameCount();
String topOne = p.getName(pathElements-2).toString();
String topTwo = p.getName(pathElements-3).toString();
Please be aware, that the result of getNameCount()
should be checked for validity, before using it as an index for getName()
.
Upvotes: 7
Reputation: 4727
File.getParent()
will remove the filename.
And the path separator you will get with: System.getProperty("file.separator")
.
Then you can use String.split()
to get each part of the path.
Upvotes: 1