web-dev-qa-db-ja.com

OSに関係なくJavaでクリーンな絶対ファイルパスを取得する方法は?

ここに問題があります。いくつかの連結の後、私はたまたまこのような文字列を持っているかもしれません

_"C:/shared_resources/samples\\import_packages\\catalog.Zip"
_

それとも

_"C:/shared_resources/samples/subfolder/..\\import_packages\\catalog.Zip"
_

このような文字列を、区切り文字が均一なパスに変換するコードが必要です。

頭に浮かぶ最初の解決策はnew File(srcPath).getCanonicalPath()を使用することですが、ここで注意が必要な部分があります。このメソッドは、テストが呼び出されるシステムに依存しています。ただし、文字列をリモートマシン(ブラウザが表示されているSelenium Gridノード)に渡す必要があります。システムはここにあり、システムはそれぞれLinuxとWindowsです。したがって、new File("C:/shared_resources/samples\\import_packages\\catalog.Zip").getCanonicalPath()を実行しようとすると、_"/home/username/ourproject/C:/shared_resources/samples/import_packages/catalog.Zip"_のような結果になります。そして、鈍い正規表現の置換を使用することもあまり良い解決策ではないようです。

暗黙的に絶対化しようとせずに、パスをプルーニングして区切り文字を均一にする(そして_.._を解決する)ための方法はありますか?

21
Actine

これで試してください:

import Java.io.IOException;
import Java.nio.file.Path;
import Java.nio.file.Paths;

public class Main {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("myFile.txt");
        Path absolutePath = path.toAbsolutePath();

        System.out.println(absolutePath.toString());
    }
}
25
Dragan Menoski

試してみてください FilenameUtils.normalize() Apacheから commons-io

1
yegor256

以下を使用できます。

Path absolutePath = path.toAbsolutePath().normalize();

...少なくとも冗長な相対セクションを排除するため。 normalize()のドキュメントに記載されているように、パスの削除されたノードが実際にリンクであった場合、解決されたファイルは異なるか、解決できなくなる可能性があります。

0
stippi