2012-11-08 15 views
6

Biorąc pod uwagę ścieżkę taką jak /a/./b/c/../d, chciałbym usunąć wszystkie wskaźniki "katalogu bieżącego" (tj. Kropkę) i "katalog nadrzędny". wskaźniki (tj. ..), podając a/b/d.Rozwiąż nazwę ścieżki za pomocą .. specyfikatorów katalogu nadrzędnego ("kropka kropka") bez rozstrzygania dowiązań symbolicznych

Mogę użyć File.getCanonicalPath(), ale to również rozwiązuje dowiązania symboliczne, których nie chcę.

Każdy prosty sposób? To znaczy, prostsze niż pisanie tokenizera i samodzielne posługiwanie się nim.

Punkty premiowe, jeśli możesz mi powiedzieć, jaka jest właściwa nazwa dla "." i ".." są w tym kontekście.

Odpowiedz

3

Możesz użyć FilenameUtils.normalize() w bibliotece Apache Commons IO - see javadoc here.

"Kropka" (.) jest bieżącym katalogiem, a "kropka kropki" (..) jest katalogiem nadrzędnym - read up on unix directories.

+0

'getAbsolutePath' nie rozwiązuje' .' lub '..' - zapewnia jedynie, że ścieżka jest bezwzględna. Ścieżki z '..' mogą nadal być bezwzględne, jak w moim przykładzie. – BeeOnRope

+0

Niestety, błędne przeczytanie Twojego pytania, zobacz moją edycję. – doublesharp

+0

Dzięki. Aby wyjaśnić, dobrze wiem, czym są '.' i' ..'. Chodziło mi o to, co konkretnie, jak w tytule mojego pytania. – BeeOnRope

6

Guava ma również to jako Files.simplifyPath(String). Jednak najlepszym rozwiązaniem (jeśli możesz używać JDK7) jest reprezentowanie ścieżki jako Path i użycie Path.normalize(), aby uzyskać znormalizowaną wersję.

+0

Dzięki. Jest to bardzo przydatne dla mnie, ponieważ jesteśmy zależni od guawy, ale nie od tej pory. Nie na Java 7, ale link był bardzo pouczający. Nie myślałem o przypadku /../ b, gdzie a jest dowiązaniem symbolicznym. – BeeOnRope