23

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

"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"。また、鈍い正規表現の置換を使用することも、あまり良い解決策ではないようです。

暗黙的に絶対化しようとせずに、パスを切り詰めて区切り文字を統一する (そしておそらく..'s を解決する) 方法はありますか?

4

4 に答える 4

30

これを試してください:

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());
    }
}
于 2013-04-19T18:04:33.910 に答える
2

以下を使用できます。

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

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

于 2019-10-09T10:26:34.260 に答える