Вам нужно использовать path.join в node.js?


135

как всем известно, Windows создает пути с обратной косой чертой, а Unix - с прямой косой чертой. node.js позволяет path.join()всегда использовать правильную косую черту. Так, например, вместо того, чтобы писать только Unix, 'a/b/c'вы бы сделали это path.join('a','b','c').

Однако кажется, что, несмотря на эту разницу, если вы не нормализуете свои пути (например, используя path.join) и просто записываете пути, такие как a/b/cnode.js, не будет проблем с запуском ваших скриптов в Windows.

Так есть ли польза перезаписи path.join('a','b','c')более 'a/b/c'? Оба работают независимо от платформы ...

Ответы:


106

Файловые системы Windows не имеют проблем с использованием прямой или обратной косой черты в качестве разделителей путей (так было еще во времена DOS). Единственная реальная проблема заключается в том, что процессоры командной строки Windows (или, более конкретно, встроенные в Windows утилиты командной строки) склонны интерпретировать косую черту как спецификаторы параметров, а не как компоненты пути. Следовательно, вам нужен путь с обратной косой чертой, если вам нужно передать путь к команде Windows, запускаемой как подпроцесс. Кроме того, вызовы Windows API (и методы из языков более высокого уровня, которые вызывают Windows API), возвращающие пути, будут использовать обратную косую черту, поэтому даже если вы не передаете их подпроцессам, вам необходимо их нормализовать.


Прямые косые черты также прерывают UNC-пути.
user2426679

Этот ответ не проясняет, зачем использовать его в типичных приложениях Node.js. Или может просто я этого не понимаю. Хотя было интересно.
Gherman

96

path.join позаботится о ненужных разделителях, которые могут возникнуть, если данные пути поступают из неизвестных источников (например, пользовательский ввод, сторонние API и т. д.).

Таким образом path.join('a/','b') path.join('a/','/b'), path.join('a','b')и path.join('a','/b')все будет давать a/b.

Не используя его, вы обычно ожидаете начала и конца соединенных путей, зная, что у них только нет или одна косая черта.


Это звучит немного полезно, но получение произвольных непроверенных путей из неизвестных источников звучит как большая проблема безопасности. Это не то, что нужно делать часто.
Герман

50

Я использую, path.joinчтобы гарантировать, что разделители папок находятся в правильных местах, не обязательно, чтобы гарантировать, что он использует прямые и обратные косые черты. Например:

path.join("/var/www", "test")

Правильно вставит разделитель между www и test /var/www/test


2
Я не понимаю этого. Если у вас есть эти скрипты в переменных, почему бы просто не добавить косую черту вручную?
mgol

2
Мне тоже сложно понять этот ответ. Не вижу никакого значения.
oligofren

23
Потому что я не всегда уверен, будут ли значения пути, которые я получаю из других источников, иметь завершающие слэши или нет. Мой пример выше был надуманным. Часто эти пути не запрограммированы жестко, а берутся из других файлов конфигурации, пользовательского ввода, библиотек и т. Д.
Тимоти Стримпл

@TimothyStrimple ~ хорошее место для использования path.joinбыло бы в другом вашем ответе здесь stackoverflow.com/questions/9027648/… . Этот ответ привел меня к другому вопросу, на который вы ответили сами :)
Pebbl

23
Я также скептически относился к этому ответу, пока через 5 минут мой код не взорвался return baseDir + relativePath + filename;. Сразу заменил на return path.join(baseDir, relativePath, filename);. Это действительно очень полезно!
Педро

34

Короткий ответ:

Все fs.*функции (например fs.open, и т . Д.) Обрабатывают путь за вас. Итак, вам не нужно использовать path.joinсебя и делать свой код неразборчивым.

Длинный ответ:

Все fs.*функции вызывают path._makeLong(path), которые, в свою очередь, вызывают path.resolve(path)специальные регулярные выражения для Windows, которые учитывают обратную \или прямую косую черту /. Вы можете убедиться в этом сами, посмотрев их исходный код по адресу:

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.