Файловые пути
У меня пожелание: давайте не будем строить файловые пути конкатенацией строк. Не будем сами и не позволим другим. Как увидите в ревью что-то вроде
file_path = some_dir + "/" + file_name
, сразу пишите комментарий: не клей строки, используй функции, для этого предназначенные.
Достоверно известен случай, когда человек потерял бизнес из-за ошибки в
файлах. Это был небольшой хостинг, и чел выполнил на всех машинах sudo rm -rf
$FOO/$BAR
. Беда в том, что переменные не подхватились, и получилось sudo rm
-rf /
.
Вы скажете, что есть флаг -e
, чтобы вылететь с ошибкой, если переменная среды
не задана. Ну, допустим. Однако ничто не мешает сделать такую же ошибку в
коде. Например, кложуристы (которые, как известно, боги программирования),
строят пути конкатенацией строк:
(str some-dir "/" subdir "/" file-name)
И не знают, что функция str
молча пропускает нуллы. Это значит, если
file-name
равен nil, то путь получится /some/dir/subdir/
. Если передать его
в функцию удаления, можно удалить всю папку.
По закону подлости, если что-то “можно”, то оно случается. Сегодня отлаживал этот баг. Человек строит путь примерно так:
(str "/tmp/" (get-dir-name ...))
Этот путь передается в функцию, которая рекурсивно удаляет папку. Но во-первых,
функция удаления была с багом и ничего не удаляла. А как только я починил,
выяснилось: при особых условиях (get-dir-name...)
выдает nil, и путь
получается /tmp/. Функция исправно удаляет весь /tmp, в котором масса нужных
файлов.
Мораль: работая с путями как строками, легко отстрелить ногу. Вдвойне печально, что это делают снова и снова. Я с этим борюсь, и вы помогайте.
Если речь про Кложу без библиотек, испольуйте io/file
:
(io/file "/tmp" subdir filename)
java.io.File<"/tmp/subsir/filename.txt">
Если один из аргументов nil, оно свалится с ошибкой. А так есть либы вроде
babashka/fs
.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter