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

Как обрабатывать ~ в пути к файлам

Я пишу простую утилиту Java командной строки. Я хотел бы, чтобы пользователь мог передать путь к файлу относительно своего домашнего каталога с помощью оператора ~. Так что-то вроде ~/Documents/...

Мой вопрос в том, есть ли способ заставить Java разрешить этот тип пути автоматически? Или мне нужно проверить путь к файлу для оператора ~?

Кажется, что этот тип функциональности следует испечь в объекте File. Но, похоже, это не так.

4b9b3361

Ответ 1

Простой path = path.replaceFirst("^~",System.getProperty("user.home"));, когда он получен от пользователя (перед тем как сделать из него File), должно быть достаточно, чтобы работать в большинстве случаев.

Ответ 2

Это расширение, специфичное для оболочки, поэтому вам нужно заменить его в начале строки, если присутствует:

String path = "~/xyz";
...
if (path.startsWith("~" + File.separator)) {
    path = System.getProperty("user.home") + path.substring(1);
}

File f = new File(path);
...

Ответ 3

Как указал Эдвин Бак в комментарии к другому ответу, ~ otheruser/Documents также должен корректно расширяться. Здесь функция, которая работала для меня:

public String expandPath(String path) {
    try {
        String command = "ls -d " + path;
        Process shellExec = Runtime.getRuntime().exec(
            new String[]{"bash", "-c", command});

        BufferedReader reader = new BufferedReader(
            new InputStreamReader(shellExec.getInputStream()));
        String expandedPath = reader.readLine();

        // Only return a new value if expansion worked.
        // We're reading from stdin. If there was a problem, it was written
        // to stderr and our result will be null.
        if (expandedPath != null) {
            path = expandedPath;
        }
    } catch (java.io.IOException ex) {
        // Just consider it unexpandable and return original path.
    }

    return path;
}

Ответ 4

Довольно обтекаемый ответ, который работает с путями с фактическими ~ символами в них:

String path = "~/Documents";
path.replaceFirst("^~", System.getProperty("user.home"));