Node file path windows

Node file path windows

Стабильность: 2 – Стабильная версия

Модуль path предоставляет утилиты для работы с путями к файлам и директориям. К нему можно получить доступ таким образом:

Windows vs POSIX

По умолчанию операции модуля path варьируются в зависимости от операционной системы, на которой запущено приложение Node.js. Конкретнее, при запуске на Windows модуль path будет подразумевать использование Windows-путей.

Например, использование функции path.basename() с путем к файлу C:\temp\myfile.html , характерным для Windows, будет давать разные результаты при запуске на POSIX и на Windows:

Для получения совместимых результатов при работе с файловыми путями Windows на любой другой операционной системе, нужно использовать path.win32:

На POSIX и Windows:

Для получения совместимых результатов при работе с файловыми путями POSIX на любой другой операционной системе, нужно использовать path.posix:

На POSIX и Windows:

path.basename(path[, ext])

Метод path.basename() возвращает последнюю порцию путей, подобно команде basename на Linux.

Может выпадать ошибка TypeError если path не является строкой или если задается параметр ext , и он не является строкой.

path.delimiter

Предоставляет разделитель пути для конкретной платформы:

Например, на POSIX:

path.dirname(path)

Метод path.dirname() возвращает имя директории path , подобно команде dirname на Linux.

Может выпадать ошибка TypeError если path не является строкой.

path.extname(path)

Метод path.extname() возвращает расширение для path , стоящее после последней точки . , которая означает конец строки в окончании пути. Если точки нет в конце пути или если первый символ базового имени path (см. path.basename() ) является точкой, то возвращается пустая строка.

Выпадает ошибка TypeError если path не является строкой.

path.format(pathObject)

Метод path.format() возвращает строку с путем из объекта. Работает в противоположность path.parse() .

При задании свойств pathObjects , следует помнить, что есть такие комбинации, в которых одно свойство имеет приоритет над другим:

  • pathObject.root игнорируется, если есть pathObject.dir
  • pathObject.ext и pathObject.name игнорируются, если существует pathObject.base

Пример для POSIX:

path.isAbsolute(path)

Метод path.isAbsolute() определяет, является ли path абсолютным путем.

Если заданный путь path является строкой с нулевой длиной, возвращается false .

Пример для POSIX:

Выпадает ошибка TypeError , если path не является строкой.

path.join([. paths])

Метод path.join() объединяет все данные сегменты пути вместе, используя для этого заданный платформенный разделитель, и приводит полученный путь к нормальному виду.

Нулевой сегмент path игнорируется. Если в результате объединения путей получилась строка с нулевой длиной, тогда возвращается ‘.’ , представляя собой текущую рабочую директорию.

Выпадает ошибка TypeError , если любой из сегментов path не является строкой.

path.normalize(path)

Метод path.normalize() нормализует данный путь, распределяя сегменты ‘..’ и ‘.’

При наличии разделяющих символов для множественных последовательных сегментов пути ( / на POSIX и \ на Windows), они заменяются единственным экземпляром заданного платформой разделителя пути. При этом завершающие разделители сохраняются.

Если путь является строкой с нулевой длиной, возвращается ‘.’ , представляя собой текущую рабочую директорию.

Пример для POSIX:

Выпадает ошибка TypeError , если path не является строкой.

path.parse(path)

Метод path.parse() возвращает объект, чьи свойства представляют собой важные элементы пути.

Возвращаемый объект будет иметь такие свойства:

Например, на POSIX:

Выпадает ошибка TypeError , если path не является строкой.

path.posix

Свойство path.posix предоставляет доступ к заданным реализациям методов path на POSIX.

path.relative(from, to)

Метод path.relative(from, to) возвращает приблизительный путь из from в to . Если from и to приводят к одному и тому же пути (после вызова path.resolve() для обоих), возвращается строка с нулевой длиной.

Если в качестве from или to передается строка с нулевой длиной, вместо таких строк будет использоваться текущая рабочая директория.

Читайте также:  Курсы по кали линукс

Пример для POSIX:

Выпадает ошибка TypeError , если ни from , ни to не являются строками.

path.resolve([. paths])

Метод path.resolve() превращает последовательность путей или сегментов пути в абсолютный путь.

Данная последовательность путей обрабатывается справа налево, добавляя префикс к каждому последующему пути перед компоновкой абсолютного пути. Например, задана последовательность сегментов пути: /foo, /bar, /baz , вызов path.resolve(‘/foo’, ‘/bar’, ‘baz’) возвратит /bar/baz .

Если после обработки все данные сегменты абсолютного пути не были сгенерированы, используется текущая рабочая директория.

Путь, полученный в результате, нормализуется и слэши, завершающие его, удаляются, но только если путь не был превращен в путь к корневой директории.

Сегменты нулевого пути игнорируются.

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

Выпадает ошибка TypeError , если любой из аргументов не является строкой.

path.sep

Предоставляет заданный платформой разделитель сегментов пути:

path.win32

Свойство path.win32 предоставляет доступ к заданным реализациям методов path на Windows.

Примечание: на Windows оба слэша – прямой (/) и обратный (\) принимаются как разделители пути, однако, в возвращаемых значениях используется только обратный слэш.

Руководство по Node.js, часть 9: работа с файловой системой

Сегодня, в девятой части перевода руководства по Node.js, мы поговорим о работе с файлами. В частности, речь пойдёт о модулях fs и path — о файловых дескрипторах, о путях к файлам, о получении информации о файлах, об их чтении и записи, о работе с директориями.

Работа с файловыми дескрипторами в Node.js

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

Дескриптор можно получить, воспользовавшись для открытия файла асинхронным методом open() из модуля fs :

Обратите внимание на второй параметр, r , использованный при вызове метода fs.open() . Это — флаг, который сообщает системе о том, что файл открывают для чтения. Вот ещё некоторые флаги, которые часто используются при работе с этим и некоторыми другими методами:

  • r+ — открыть файл для чтения и для записи.
  • w+ — открыть файл для чтения и для записи, установив указатель потока в начало файла. Если файл не существует — он создаётся.
  • a — открыть файл для записи, установив указатель потока в конец файла. Если файл не существует — он создаётся.
  • a+ — открыть файл для чтения и записи, установив указатель потока в конец файла. Если файл не существует — он создаётся.

Файлы можно открывать и пользуясь синхронным методом fs.openSync() , который, вместо того, чтобы предоставить дескриптор файла в коллбэке, возвращает его:

После получения дескриптора любым из вышеописанных способов вы можете производить с ним необходимые операции.

Данные о файлах

С каждым файлом связан набор данных о нём, исследовать эти данные можно средствами Node.js. В частности, сделать это можно, используя метод stat() из модуля fs .

Вызывают этот метод, передавая ему путь к файлу, и, после того, как Node.js получит необходимые сведения о файле, он вызовет коллбэк, переданный методу stat() . Вот как это выглядит:

В Node.js имеется возможность синхронного получения сведений о файлах. При таком подходе главный поток блокируется до получения свойств файла:

Информация о файле попадёт в константу stats . Что это за информация? На самом деле, соответствующий объект предоставляет нам большое количество полезных свойств и методов:

  • Методы .isFile() и .isDirectory() позволяют, соответственно, узнать, является ли исследуемый файл обычным файлом или директорией.
  • Метод .isSymbolicLink() позволяет узнать, является ли файл символической ссылкой.
  • Размер файла можно узнать, воспользовавшись свойством .size .

Тут имеются и другие методы, но эти — самые употребимые. Вот как ими пользоваться:

Пути к файлам в Node.js и модуль path

Путь к файлу — это адрес того места в файловой системе, где он расположен.

В Linux и macOS путь может выглядеть так:

В Windows пути выглядят немного иначе:

На различия в форматах записи путей при использовании разных операционных систем следует обращать внимание, учитывая операционную систему, используемую для развёртывания Node.js-сервера.

В Node.js есть стандартный модуль path , предназначенный для работы с путями к файлам. Перед использованием этого модуля в программе его надо подключить:

▍Получение информации о пути к файлу

Если у вас есть путь к файлу, то, используя возможности модуля path , вы можете, в удобном для восприятия и дальнейшей обработки виде, узнать подробности об этом пути. Выглядит это так:

Читайте также:  Аналог ультра исо для линукс

Здесь, в строке notes , хранится путь к файлу. Для разбора пути использованы следующие методы модуля path :

  • dirname() — возвращает родительскую директорию файла.
  • basename() — возвращает имя файла.
  • extname() — возвращает расширение файла.

Узнать имя файла без расширения можно, вызвав метод .basename() и передав ему второй аргумент, представляющий расширение:

▍Работа с путями к файлам

Несколько частей пути можно объединить, используя метод path.join() :

Найти абсолютный путь к файлу на основе относительного пути к нему можно с использованием метода path.resolve() :

В данном случае Node.js просто добавляет /flavio.txt к пути, ведущем к текущей рабочей директории. Если при вызове этого метода передать ещё один параметр, представляющий путь к папке, метод использует его в качестве базы для определения абсолютного пути:

Если путь, переданный в качестве первого параметра, начинается с косой черты — это означает, что он представляет собой абсолютный путь.

Вот ещё один полезный метод — path.normalize() . Он позволяет найти реальный путь к файлу, используя путь, в котором содержатся спецификаторы относительного пути вроде точки ( . ), двух точек ( .. ), или двух косых черт:

Методы resolve() и normalize() не проверяют существование директории. Они просто находят путь, основываясь на переданным им данным.

Чтение файлов в Node.js

Самый простой способ чтения файлов в Node.js заключается в использовании метода fs.readFile() с передачей ему пути к файлу и коллбэка, который будет вызван с передачей ему данных файла (или объекта ошибки):

Если надо, можно воспользоваться синхронной версией этого метода — fs.readFileSync() :

По умолчанию при чтении файлов используется кодировка utf8 , но кодировку можно задать и самостоятельно, передав методу соответствующий параметр.

Методы fs.readFile() и fs.readFileSync() считывают в память всё содержимое файла. Это означает, что работа с большими файлами с применением этих методов серьёзно отразится на потреблении памяти вашим приложением и окажет влияние на его производительность. Если с такими файлами нужно работать, лучше всего воспользоваться потоками.

Запись файлов в Node.js

В Node.js легче всего записывать файлы с использованием метода fs.writeFile() :

Есть и синхронная версия того же метода — fs.writeFileSync() :

Эти методы, по умолчанию, заменяют содержимое существующих файлов. Изменить их стандартное поведение можно, воспользовавшись соответствующим флагом:

Тут могут использоваться флаги, которые мы уже перечисляли в разделе, посвящённом дескрипторам. Подробности о флагах можно узнать здесь.

Присоединение данных к файлу

Метод fs.appendFile() (и его синхронную версию — fs.appendFileSync() ) удобно использовать для присоединения данных к концу файла:

Об использовании потоков

Выше мы описывали методы, которые, выполняя запись в файл, пишут в него весь объём переданных им данных, после чего, если используются их синхронные версии, возвращают управление программе, а если применяются асинхронные версии — вызывают коллбэки. Если вас такое состояние дел не устраивает — лучше будет воспользоваться потоками.

Работа с директориями в Node.js

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

▍Проверка существования папки

Для того чтобы проверить, существует ли директория и может ли Node.js получить к ней доступ, учитывая разрешения, можно использовать метод fs.access() .

▍Создание новой папки

Для того чтобы создавать новые папки, можно воспользоваться методами fs.mkdir() и fs.mkdirSync() :

▍Чтение содержимого папки

Для того чтобы прочесть содержимое папки, можно воспользоваться методами fs.readdir() и fs.readdirSync() . В этом примере осуществляется чтение содержимого папки — то есть — сведений о том, какие файлы и поддиректории в ней имеются, и возврат их относительных путей:

Вот так можно получить полный путь к файлу:

Результаты можно отфильтровать для того, чтобы получить только файлы и исключить из вывода директории:

▍Переименование папки

Для переименования папки можно воспользоваться методами fs.rename() и fs.renameSync() . Первый параметр — это текущий путь к папке, второй — новый:

Переименовать папку можно и с помощью синхронного метода fs.renameSync() :

▍Удаление папки

Для того чтобы удалить папку, можно воспользоваться методами fs.rmdir() или fs.rmdirSync() . Надо отметить, что удаление папки, в которой что-то есть, задача несколько более сложная, чем удаление пустой папки. Если вам нужно удалять такие папки, воспользуйтесь пакетом fs-extra, который весьма популярен и хорошо поддерживается. Он представляет собой замену модуля fs , расширяющую его возможности.

Читайте также:  Как запретить windows устанавливать свои драйвера

Метод remove() из пакета fs-extra умеет удалять папки, в которых уже что-то есть.

Установить этот модуль можно так:

Вот пример его использования:

Его методами можно пользоваться в виде промисов:

Допустимо и применение конструкции async/await:

Модуль fs

Выше мы уже сталкивались с некоторыми методами модуля fs , применяемыми при работе с файловой системой. На самом деле, он содержит ещё много полезного. Напомним, что он не нуждается в установке, для того, чтобы воспользоваться им в программе, его достаточно подключить:

После этого у вас будет доступ к его методам, среди которых отметим следующие, некоторые из которых вам уже знакомы:

  • fs.access() : проверяет существование файла и возможность доступа к нему с учётом разрешений.
  • fs.appendFile() : присоединяет данные к файлу. Если файл не существует — он будет создан.
  • fs.chmod() : изменяет разрешения для заданного файла. Похожие методы: fs.lchmod() , fs.fchmod() .
  • fs.chown() : изменяет владельца и группу для заданного файла. Похожие методы: fs.fchown() , fs.lchown() .
  • fs.close() : закрывает дескриптор файла.
  • fs.copyFile() : копирует файл.
  • fs.createReadStream() : создаёт поток чтения файла.
  • fs.createWriteStream() : создаёт поток записи файла.
  • fs.link() : создаёт новую жёсткую ссылку на файл.
  • fs.mkdir() : создаёт новую директорию.
  • fs.mkdtemp() : создаёт временную директорию.
  • fs.open() : открывает файл.
  • fs.readdir() : читает содержимое директории.
  • fs.readFile() : считывает содержимое файла. Похожий метод: fs.read() .
  • fs.readlink() : считывает значение символической ссылки.
  • fs.realpath() : разрешает относительный путь к файлу, построенный с использованием символов . и .. , в полный путь.
  • fs.rename() : переименовывает файл или папку.
  • fs.rmdir() : удаляет папку.
  • fs.stat() : возвращает сведения о файле. Похожие методы: fs.fstat() , fs.lstat() .
  • fs.symlink() : создаёт новую символическую ссылку на файл.
  • fs.truncate() : обрезает файл до заданной длины. Похожий метод: fs.ftruncate() .
  • fs.unlink() : удаляет файл или символическую ссылку.
  • fs.unwatchFile() : отключает наблюдение за изменениями файла.
  • fs.utimes() : изменяет временную отметку файла. Похожий метод: fs.futimes() .
  • fs.watchFile() : включает наблюдение за изменениями файла. Похожий метод: fs.watch() .
  • fs.writeFile() : записывает данные в файл. Похожий метод: fs.write() .

Интересной особенностью модуля fs является тот факт, что все его методы, по умолчанию, являются асинхронными, но существуют и их синхронные версии, имена которых получаются путём добавления слова Sync к именам асинхронных методов.

  • fs.rename()
  • fs.renameSync()
  • fs.write()
  • fs.writeSync()

Использование синхронных методов серьёзно влияет на то, как работает программа.

В Node.js 10 имеется экспериментальная поддержка этих API, основанных на промисах.

Исследуем метод fs.rename() . Вот асинхронная версия этого метода, использующая коллбэки:

При использовании его синхронной версии для обработки ошибок используется конструкция try/catch :

Основное различие между этими вариантами использования данного метода заключается в том, что во втором случае выполнение скрипта будет заблокировано до завершения файловой операции.

Модуль path

Модуль path, о некоторых возможностях которого мы тоже уже говорили, содержит множество полезных инструментов, позволяющих взаимодействовать с файловой системой. Как уже было сказано, устанавливать его не нужно, так как он является частью Node.js. Для того чтобы пользоваться им, его достаточно подключить:

Свойство path.sep этого модуля предоставляет символ, использующийся для разделения сегментов пути ( \ в Windows и / в Linux и macOS), а свойство path.delimiter даёт символ, используемый для отделения друг от друга нескольких путей ( ; в Windows и : в Linux и macOS).

Рассмотрим и проиллюстрируем примерами некоторые методы модуля path .

▍path.basename()

Возвращает последний фрагмент пути. Передав второй параметр этому методу можно убрать расширение файла.

▍path.dirname()

Возвращает ту часть пути, которая представляет имя директории:

▍path.extname()

Возвращает ту часть пути, которая представляет расширение файла:

▍path.isAbsolute()

Возвращает истинное значение если путь является абсолютным:

▍path.join()

Соединяет несколько частей пути:

▍path.normalize()

Пытается выяснить реальный путь на основе пути, который содержит символы, использующиеся при построении относительных путей вроде . , .. и // :

▍path.parse()

Преобразует путь в объект, свойства которого представляют отдельные части пути:

  • root : корневая директория.
  • dir : путь к файлу, начиная от корневой директории
  • base : имя файла и расширение.
  • name : имя файла.
  • ext : расширение файла.

Вот пример использования этого метода:

В результате его работы получается такой объект:

▍path.relative()

Принимает, в качестве аргументов, 2 пути. Возвращает относительный путь из первого пути ко второму, основываясь на текущей рабочей директории:

▍path.resolve()

Находит абсолютный путь на основе переданного ему относительного пути:

Оцените статью