Подтвердить что ты не робот

Как получить чистый абсолютный путь к файлу в Java, независимо от ОС?

Вот проблема. После некоторых конкатенаций у меня может быть строка вроде этого

"C:/shared_resources/samples\\import_packages\\catalog.zip"

или даже это

"C:/shared_resources/samples/subfolder/..\\import_packages\\catalog.zip"

Я хочу иметь некоторый код, который преобразует такую ​​строку в путь с равномерными разделителями.

Первое решение, которое приходит на ум, использует new File(srcPath).getCanonicalPath(), однако здесь сложная часть. Этот метод зависит от системы, в которой выполняются тесты. Однако мне нужно передать строку на удаленную машину (Selenium Grid node с браузером там), а в системах здесь и там есть Linux и Windows соответственно. Поэтому попытка сделать new File("C:/shared_resources/samples\\import_packages\\catalog.zip").getCanonicalPath() приводит к чему-то вроде "/home/username/ourproject/C:/shared_resources/samples/import_packages/catalog.zip". И использование тупой замены регулярных выражений тоже не очень хорошее решение.

Есть ли способ просто обрезать путь и сделать разделители единообразными (и, возможно, разрешать ..), не пытаясь его абсолютизировать абсолютизировать?

4b9b3361

Ответ 1

Попробуйте следующее:

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());
    }
}

Ответ 3

Вы можете использовать:

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

... хотя бы для устранения избыточных относительных секций. Как упоминается в документации для normalize(), в случае, если удаленный узел пути фактически являлся ссылкой, разрешенный файл может отличаться или больше не может быть разрешен.

Ответ 4

например, вот ваш путь:

String jarName = "C:/shared_resources/samples\\import_packages\\catalog.zip"
jarName.replaceAll("/", "\\");
jarName.replaceAll("..", "/");