EN · DE · RU · FR · ES

#1878: CanonicalFileUtils.java

projectforge-common/src/main/java/org/projectforge/common/CanonicalFileUtils.java Вспомогательный класс — пакет org.projectforge.common, projectforge-common/src/main/java/org/projectforge/common/CanonicalFileUtils.java 67 строк · 34 кода · 27 комментариев · 6 пустых
Утилита нормализации путей к файлам, которая разрешает символические ссылки, устраняет компоненты пути .. и ., а также нормализует разделители пути через File.getCanonicalPath(). Корректно обрабатывает ошибки ввода-вывода, возвращаясь к getAbsolutePath(). Предоставляет перегрузки на основе строк и объектов File для разрешения пути. Используется везде, где ProjectForge необходимо сравнивать пути к файлам или обеспечивать единообразное представление пути.

Архитектура

Импорты

Основные операции

1. absolutePath(File file) → String

Возвращает канонический путь файла в виде строки. Если getCanonicalPath() выбрасывает IOException (например, файл не существует и файловая система не может разрешить его каноническую форму), возвращается getAbsolutePath() и ошибка записывается в журнал.

2. absolute(File file) → File

Та же логика, но возвращает объект File через getCanonicalFile() / getAbsoluteFile().

3. absolute(String path) → File

Удобная перегрузка, которая оборачивает строковый путь в new File(path) и делегирует выполнение absolute(File).

Почему канонический путь?

Метод Java File.getCanonicalPath() предоставляет несколько гарантий, которых нет у getAbsolutePath():

Это критически важно для операций, чувствительных к безопасности, где пути из пользовательского ввода должны сравниваться с разрешёнными путями — два разных строковых представления могут ссылаться на один и тот же файл (например, /home/user/../user/file и /home/user/file).

Стратегия обработки ошибок

Класс использует шаблон плавной деградации: если каноническое разрешение не удаётся (IOException), он возвращается к абсолютному пути и записывает ошибку в журнал. Это важно, поскольку getCanonicalPath() может выбросить IOException по причинам, не зависящим от приложения (например, права доступа к файловой системе, проблемы с монтированием NFS или отсутствие файла). Запасной вариант гарантирует, что приложение продолжит работу, хотя и с потенциально ненормализованным путём.

Обработка null

Все методы корректно обрабатывают входной null — возвращают null без выбрасывания NullPointerException. Это упрощает код вызывающего, устраняя необходимость проверок на null перед вызовом утилиты.

Контекст использования в ProjectForge

CanonicalFileUtils используется в таких сценариях, как:

Сообщение журнала "Внутренняя ошибка при попытке получить канонический путь" может вводить в заблуждение — IOException от getCanonicalPath() не обязательно является "внутренней ошибкой", а часто представляет собой условие окружения (отсутствующий файл, отказано в доступе). Возврат к getAbsolutePath() молча принимает потенциально ненормализованный путь.
Класс намеренно минимален (3 метода, ~30 строк логики). Он выделяет очень специфическую задачу — нормализацию пути с плавным запасным вариантом — из более широкого класса FileHelper. Это следует принципу единственной ответственности, сохраняя утилиты сфокусированными и тестируемыми.

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки исходных файлов: 2024 -> 2025.
b6092df09 Авторские права 2023 -> 2024
ab45d51fa Авторские права 2001-2022 -> 2001-2023.
5f7ef41b8 Авторские права 2021 -> 2022
ceb63e8a1 Заголовок исходного кода: (C) 2001-2021.
7c79f1922 Авторские права в заголовке исходного кода -> 2020.
bd25a85fb WIP: Мастер настройки (Swing и Lanterna)