Чи потрібно використовувати path.join у node.js?


134

як всім відомо, 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, запущеної як підпроцес. Також виклики API API (і методи з мов вищого рівня, які викликають API Windows), які повертають шляхи повернення, використовуватимуть зворотні риски, тому навіть якщо ви не передаєте їх підпроцесам, вам потрібно їх нормалізувати.


Передні косої лінії також розбивають контури UNC.
користувач2426679

Ця відповідь не дає зрозуміти, чому його використовувати в типових програмах Node.js. А може, це я просто не отримую. Хоча це було цікаво.
Герман

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 та тестом /var/www/test


2
Я не розумію цього моменту. Якщо у вас є ці сценарії зі змінними, чому б просто не додати косу рису вручну?
мгдол

2
У мене також є проблеми з розумінням цієї відповіді. Неможливо побачити значення.
олігофрен

23
Тому що я не завжди впевнений, чи матимуть значення траєкторій, отримані з інших джерел, косою косою рисою чи ні. Мій приклад вище був надуманий. Часто ці шляхи не кодуються важко, але їх витягують з інших файлів конфігурації, вводу користувачів, бібліотек тощо
Timothy Strimple

@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), який має спеціальні RegExps для Windows, який враховує нахил нахилу або перекидання \вперед /. Ви можете перевірити це, переглянувши їх вихідний код за адресою:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.