В примере:
var assets = "images/"
var sounds = assets+"sounds/"
Является ли более привычным помещать косую черту в конец пути к файлу?
var assets = "/images"
var sounds = assets+"/sounds"
Есть ли другой метод, который является хорошей общей практикой?
conventions
file-structure
iiridescent
источник
источник
File.separator
хотя,File
иPath
API , принимают как/
и `\`.Ответы:
Почти каждый основной язык программирования имеет библиотеку для обработки разделителей каталогов для вас. Вы должны использовать их. Это упростит ваш код и предотвратит ошибки .
По моему опыту, обычная причина для объединения строк, как это, заключается в том, что они приходят из разных источников. Иногда это разные части из файла конфигурации. Иногда это константа в сочетании с аргументом функции. В любом случае, когда они поступают из разных источников, вы должны рассмотреть несколько различных возможных случаев использования разделителей на концах:
"images/"
и"/sounds"
"images"
и"/sounds"
или"images/"
и"sounds"
"images"
и"sounds"
Тот факт, что каждая часть исходит из разных источников, означает, что у каждого источника могут быть свои представления о том, какие соглашения следует соблюдать, если кто-то вообще об этом подумал! Что бы ни вызывало ваш код, вам не нужно об этом беспокоиться . Ваш код должен обрабатывать все случаи, потому что кто- то нарушит ваше соглашение . Это приведет к потере времени на изучение причины ошибки и исправление. У меня было несколько неприятных случаев, когда коллега делал предположение о том, как пути должны быть отформатированы в файле конфигурации, что означало, что я должен был найти код и выяснить, что они ожидали (или исправить код).
Большинство основных языков предоставляют метод для этого, который уже обрабатывает многие случаи:
os.path.join
для PythonFile.join
для РубиPath.join
для Node.jsPaths.get
для Java (7 и выше)Path.Combine
для .NETЕсть предостережение с этим. Некоторые из них, по-видимому, предполагают, что ведущий разделитель каталогов во втором аргументе относится к корневому пути и что это означает, что первый аргумент должен быть отброшен полностью. Я не знаю, почему это считается полезным; для меня это просто вызывает проблемы. Я никогда не хотел объединять две части пути и в итоге отбрасывать первую часть. Внимательно прочитайте документацию для особых случаев и, при необходимости, напишите обертку, которая делает с ними то, что вам нужно, а не с их специальной обработкой.
Это также помогает, если у вас есть необходимость поддержки различных операционных систем. Эти классы почти повсеместно объясняют выбор правильного разделителя. В библиотеках также есть способ нормализации путей в соответствии с соглашениями ОС.
В случае, если ваш язык программирования не имеет легкодоступной библиотеки, вы должны написать метод, который обрабатывает все эти случаи и использует его свободно и в разных проектах.
Это относится к категории «не делайте предположений» и «используйте инструменты, которые вам помогут».
источник
C:\Documents and Settings\Admin
сmy folder:document.txt
системой * nix для создания/home/admin/my folder/document.txt
- забавный трюк, но в реальном мире эвристика включала больше ошибок, чем исправляла.Paths.get()
просто конвертирует синглString
вPath
объект. Чтобы объединить пути, вы должны использоватьPath.resolve()
, который может принимать другойPath
илиString
. ВPath
классе есть и другие методы, которые дополнительно позволяют соединять пути различными способами.Paths
очень хорошо читал документы .[System.IO.Path]::Combine("abc", "\def")
который имеет описанное поведение, является командлет,Join-Path "abc" "\def"
который дает"abc\def"
.В Java ответом будет «ни один из вышеперечисленных». Лучшей практикой будет собирать имена путей с использованием
java.io.File
класса; напримерFile
Класс также заботится о конкретных платформах имени пути сепараторов.Существует отдельный вопрос о том, должен ли ваш путь начинаться с косой черты или нет. Но это больше связано с правильностью, чем с лучшей практикой. Путь, начинающийся с косой черты, означает что-то отличное от пути, который этого не делает !!
В библиотеке Javascript core (ECMA) нет явной поддержки обработки имён путей, но (по крайней мере) Node.js обеспечивает поддержку через модуль Path.
источник
os.path.join
. PowerShell имеетjoin-path
. Я бы добавил что-то к этому ответу. Я обнаружил, что если вам нужны пути к файлам из нескольких частей, это делает ваш код очень хрупким, если вы предполагаете, что у какого-либо из них есть пути к файлам в определенных местах. Использование этих классов не только помогает с переносимостью, но также обрабатывает все возможные крайние случаи (косая черта на обоих концах, подлежащих соединению, косая черта только на одной стороне, никакая косая черта между ними вообще). Эта гибкость неоценима, когда вы сбрасываете пути к файлам в файле конфигурации.Обратите внимание, что в .NET вы должны использовать метод Path.Combine.
Причина этого в том, что он «знает» правильные символы, которые будут использоваться при построении имен папок.
Это устраняет «проблему» предварительной или последующей фиксации.
источник
os.path.join('src', '../../../your_secret_stuff')
это действительно в Python; другими словами, не используйте эти методы вслепую при вводе данных пользователем.При построении путей я часто использую функцию, которая добавляет косую черту, если ее там еще нет. Тогда пути могут быть построены так:
где fs () добавляет завершающий слеш, если это необходимо.
источник
Папки и файлы отличаются только одним аспектом: папки заканчиваются косой чертой, а файлы - нет. Кроме того, абсолютные пути начинаются с
/
относительных путей, где нет. Если вы используете это последовательно объединяя пути и файлы вместе, не должно быть никаких проблем.Объединять два абсолютных пути вместе не имеет смысла, так как второй путь должен быть относительно первого пути. Объединение двух относительных путей вместе не является проблемой, но может привести к неопределенному поведению, если программа не знает, где находится относительный путь.
источник
var a = "/my/path" + "css/" + "test.css"; //Output: "/my/pathcss/test.css"
absolutepath
должен был закончиться косой чертой, потому что это путь. Каким-то образом я упустил это из виду, когда написал это.Я думаю, что нет никакого волшебства или «обычной практики» в том, как реализовать пути, но, конечно, объединение строк не является подходящим способом. Вы можете разработать собственный API для работы с делами, но это может потребовать некоторых усилий. В частности, вы должны быть осторожны с различными платформами. Например, в Windows
\
это разделитель, а в системах на основе Unix/
это разделитель.Я не знаком с библиотеками Javascript, но я уверен, что должны быть библиотеки для обработки этих случаев. Например, в Java вы можете использовать API-интерфейс Path для работы с независимыми от платформы операциями пути.
источник
/
качестве разделителя пути. Для этого нужны причуды в командной строке, но API файлового ввода-вывода прекрасно работают с прямой косой чертой.Мои личные предпочтения таковы:
Я всегда использую абсолютные пути (
/images/...
), мне кажется, что он менее подвержен ошибкам. Это также более надежное использование,var sounds = assets+"/sounds"
потому что даже еслиassets
у вас есть косая черта, и вы в конечном итоге/images//sounds
, оно все равно решит/images/sounds
. Один отказ от ответственности в том, что это зависит от вашего обработчика запросов. Apache, кажется, справляется с этим нормально (по крайней мере, некоторые версии / конфигурации см. Http://www.amazon.com//gp//site-directory//ref=nav_sad ). С другим способом, которым вы в конечном итоге/imagessounds
, не так глупо :) Есть также возможность проверить двойные слэши и очистить их. Не вариант с другим подходом.источник
/
), является абсолютным , а не относительным. Или вы имели в виду это только для путей, кроме первого?/somewhere
это относительный путь, потому что он не включает хост, поэтому браузер будет искать его на основе хоста текущей страницы ... В веб-миреhttp://here/somewhere
это абсолютный URI, который/somewhereelse
относится к нему. В мире файловых систем,/somewhere
это абсолютное значение, идущее от root/
, и «whereelse» относительно текущего рабочего каталога.http://here/somewhere
это URI с абсолютным путем,/somewhere
относительная ссылка с абсолютным путем иsomewhere/else
относительная ссылка с относительным путем. По-видимому, в этих кругах «относительный путь» используется для обозначения относительной ссылки.В Smalltalk очень просто определить метод / в String, чтобы он работал следующим образом:
Вот простая реализация метода (вы можете сделать его лучше):
Примечание : Вы также можете уделять больше внимания пограничных случаев , таких как
'' / ''
,'x/' / ''
и т.д., для того , чтобы определить правильное поведение.источник