- Node file path windows
- Windows vs POSIX
- path.basename(path[, ext])
- path.delimiter
- path.dirname(path)
- path.extname(path)
- path.format(pathObject)
- path.isAbsolute(path)
- path.join([. paths])
- path.normalize(path)
- path.parse(path)
- path.posix
- path.relative(from, to)
- path.resolve([. paths])
- path.sep
- path.win32
- Руководство по Node.js, часть 9: работа с файловой системой
- Работа с файловыми дескрипторами в Node.js
- Данные о файлах
- Пути к файлам в Node.js и модуль path
- ▍Получение информации о пути к файлу
- ▍Работа с путями к файлам
- Чтение файлов в Node.js
- Запись файлов в Node.js
- Присоединение данных к файлу
- Об использовании потоков
- Работа с директориями в Node.js
- ▍Проверка существования папки
- ▍Создание новой папки
- ▍Чтение содержимого папки
- ▍Переименование папки
- ▍Удаление папки
- Модуль fs
- Модуль path
- ▍path.basename()
- ▍path.dirname()
- ▍path.extname()
- ▍path.isAbsolute()
- ▍path.join()
- ▍path.normalize()
- ▍path.parse()
- ▍path.relative()
- ▍path.resolve()
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 , расширяющую его возможности.
Метод 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()
Находит абсолютный путь на основе переданного ему относительного пути: