Node js удалить папку с файлами

Обновлено: 07.07.2024

Для работы с файлами в Node.js используется встроенный модуль fs , который выполняет все синхронные и асинхронные операции ввода/вывода применительно к файлам. Чтение и запись файла могут осуществляться одним из двумя способов:

  • с использованием Buffer ;
  • через создание соответствующего потока.

Чтение файлов и директорий¶

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

  • путь к файлу;
  • кодировка;
  • callback-функция, вызываемая после получения содержимого файла.

Callback-функции передается два аргумента: ошибка и полученные данные в строковом формате. Если операция прошла успешна, то в качестве ошибки передается null .

Если в readFile() не указать кодировку, то данные файла будут возвращены в формате Buffer .

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

Node.js readFileSync() возвращает результат чтения файла и принимает два параметра:

Обработка и перехват ошибок при использовании readFileSync() осуществляется с помощью конструкции try<. >catch() <. >.

Чтобы инициировать ошибку, укажите неправильный путь к файлу.

Методы readFile() и readFileSync() для работы с файлами используют Buffer . Но есть и другой способ считать содержимое файла: создать поток с помощью Node.js fs.createReadStream() . Любой поток в Node.js является экземпляром класса EventEmitter , который позволяет обрабатывать возникающие в потоке события.

Параметры, принимаемые fs.createReadStream() :

  • путь к файлу;
  • объект со следующими настройками:
  • encoding - кодировка (по умолчанию utf8 );
  • mode - режим доступа (по умолчанию 0o666 );
  • autoClose - если true , то при событиях error и finish поток закроется автоматически (по умолчанию true ).

Вместо объекта настроек можно передать строку, которая будет задавать кодировку.

Использование потока имеет ряд преимуществ перед Buffer :

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

Node.js readdir() работает асинхронно и принимает три аргумента:

  • путь к директории;
  • кодировку;
  • callback-функцию, которая принимает аргументами ошибку и массив файлов директории (при успешном выполнении операции ошибка передается как null ).

Node.js readdirSync() работает синхронно, возвращает массив найденных файлов и принимает два параметра:

Создание и запись файлов и директорий¶

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

  • путь к файлу;
  • данные для записи;
  • параметры записи:
  • кодировка (по умолчанию utf8 );
  • права доступа (по умолчанию 0o666 );
  • callback-функция, которая вызывается по завершению операции и единственным аргументом принимает ошибку (в случае успешной записи передается null ).

Если нет необходимости указывать параметры записи, то третьим параметром Node.js writeFile() можно сразу передать callback-функцию.

Для синхронной записи Node.js файла используйте writeFileSync() . Метод принимает все те же аргументы, что и writeFile() за исключением callback-функции. В качестве значения возвращает undefined .

Как и в случае с readFileSync() обработка ошибок происходит с помощью try<. >catch() <. >.

Методы writeFile() и writeFileSync() перезаписывают уже имеющуюся в файле информацию новыми данными. Если вам нужно внести новые данные без удаления старых, используйте методы appendFIle() и appendFileAsync() , которые имеют идентичные параметры.

Для записи файла через потока ввода имеется метод fs.createWriteStream() , который возвращает поток ввода и принимает два параметра:

  • путь к файлу;
  • объект со следующими настройками:
  • encoding - кодировка (по умолчанию utf8 );
  • mode - режим доступа (по умолчанию 0o666 );
  • autoClose - если true , то при событиях error и finish поток закроется автоматически (по умолчанию true ).

Чтобы создать директорию, используйте методы mkdir() и mkdirSync() .

Node.js mkdir() работает асинхронно и принимает в качестве параметров:

  • путь к директории;
  • объект со следующими настройками:
  • recursive - если true , создает директорию и все ее родительские директории согласно указанному пути, если они еще не существуют (по умолчанию false , т. е. все родительские директории уже должны быть созданы, иначе будет сгенерирована ошибка);
  • mode - режим доступа, параметр не поддерживается на ОС Windows (по умолчанию 0o777 );
  • callback-функцию, которая единственным аргументом принимает ошибку, при успешном создании директории передается null .

Вторым параметром можно сразу передать callback-функцию.

Node.js mkdirSync() создает директорию синхронно и возвращает undefined . Обработка ошибок осуществляется через try<. >catch() <. >. Метод mkdirSync() принимает те же параметры, что и mkdir() , за исключением callback-функции.

Удаление файлов и директорий¶

Чтобы удалить в Node.js файлы используйте методы unlink() и unlinkSync() .

Метод unlink() асинхронный и принимает имя файла, который нужно удалить, и callback-функцию с ошибкой в качестве параметра ( null , если удаление прошло успешно).

Для синхронного удаления файла используйте unlinkSync() , которому единственным аргументом передается имя файла.

Для удаления директорий имеются методы rmdir() и rmdirSync() соответственно. Они полностью идентичны unlink() и unlinkSync() , только вместо имени файла принимают имя директории.

В моем приложении Node мне нужно удалить каталог с несколькими файлами, но fs.rmdir работает только в пустых каталогах. Как я могу это сделать?

Асинхронное использование:

Синхронизация использования:

Удалить папку синхронно

Большинство людей, использующих fs с Node.js, хотели бы, чтобы функции были близки к "Unix-способу" работы с файлами. Я использую fs-extra, чтобы принести все классные вещи:

fs-extra содержит методы, которые не включены в пакет vanilla Node.js fs. Такие как mkdir -p, cp -r и rm -r f.

Более того, fs-extra - капля на замену родным fs. Все методы в fs не изменены и привязаны к нему. Это означает, что вы можете заменить fs на fs-extra:

И тогда вы можете удалить папку следующим образом:

Использует path.join для лучшего кроссплатформенного опыта. Так что не забывайте требовать этого.

Также переименована функция в rimraf ;)

С Node.js 12.10 вы, наконец, можете сделать простое:

Опция recursive рекурсивно удаляет все это.

Вот асинхронная версия ответа @SharpCoder

Я написал эту функцию под названием remove folder. Он будет рекурсивно удалять все файлы и папки в определенном месте. Единственный требуемый пакет - асинхронный.

Я обычно не воскрешаю старые темы, но здесь есть много чего, и без ответа, все это кажется мне слишком сложным.

Во-первых, в современном Node (> = v8.0.0) вы можете упростить процесс, используя только базовые модули узла, полностью асинхронные, и распараллеливать одновременное связывание файлов в одной функции из пяти строк и при этом сохранять читабельность:

С другой стороны, защита для атак обхода пути не подходит для этой функции, поскольку

  1. Это выходит за рамки, основанные на принципе единой ответственности.
  2. Должен быть обработан вызывающей стороной, а не этой функцией. Это похоже на командную строку rm -rf в том, что она принимает аргумент и позволяет пользователю rm -rf / , если его попросят. Сценарий должен защищать не саму программу rm .
  3. Эта функция не сможет определить такую атаку, поскольку у нее нет системы отсчета. Опять же, это ответственность вызывающего абонента, который будет иметь контекст намерения, который предоставит ему ссылку для сравнения обхода пути.
  4. Сим-ссылки не являются проблемой, так как .isDirectory() является false для сим-ссылок и не связаны, не повторяются.

И последнее, но не менее важное: существует редкое условие состязания, при котором рекурсия может привести к ошибке, если одна из записей была отсоединена или удалена вне этого сценария как раз в нужное время, пока выполняется эта рекурсия. Поскольку этот сценарий не является типичным в большинстве сред, его, вероятно, можно пропустить. Однако при необходимости (для некоторых крайних случаев) эту проблему можно решить с помощью этого немного более сложного примера:

Доброго времени суток, друзья. Поговорим сегодня о работе с файлами в Node.js. Для работы с файлами используется модуль fs (сокращение от File System).

В этой статье мы рассмотрим следующие темы:

Для начала работы нам потребуется установленная Node.js. Подробную инструкцию по ее установке вы можете получить (тут).

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

Пробежимся по основным методам этого модуля и посмотрим на примерах как с ними можно работать.

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

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

Файловый дескриптор — это неотрицательное целое число. Когда создается новый поток ввода-вывода, ядро возвращает процессу, создавшему поток ввода-вывода, его файловый дескриптор (Wikipedia).

Перейдем к примерам.

Ниже я приведу перечень флагов доступа к файлам

Следует помнить, что дескрипторы файлов необходимо закрывать для предотвращения переполнения памяти, а также проблем с производительностью. Выполним данную задачу с помощью метода close() и его синхронного аналога closeSync().

Работа с директориями

Для проверки существующей директории (файла) и доступов к нему в модуле fs применяется метод access

Вторым параметром устанавливается константа режима проверки:

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

Для создания каталогов присутствует асинхронный метод mkdir и синхронный mkdirSync.

Для создания в текущей директории нового каталога, перед путем следует указать переменную __dirname как вариант реализации абсолютного пути, либо воспользоваться метом resolve модуля path.

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

Для получения содержимого директории используются два метода readdir и readdirSync. Первым параметром для методов передается путь директории, содержимое которой нужно получить.

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

Удаление директории производится с помощью методов rmdir и rmdirSync. Первым параметром методов является путь удаляемой директории.

Получение системной информации о файле

Каждый файл, который мы загружаем, помимо данных хранит в себе системную информацию. Для получения этой информации можно воспользоваться методом stat() или выбрать синхронный вариант statSync()

Вся информация хранится в получаемом объекте stats. Данный объект хранит в себе методы для получения дополнительной полезной информации.

Перечислю некоторые из этих свойств:

stats.isDirectory() метод позволяет узнать, является ли файл директорией;

stats.isFile() метод возвращает true, если это файл;

stats.isSocket() метод возвращает true, если это сокет;

stats.isSymbolicLink() метод возвращает true, если файл является символьной ссылкой;

stats.size свойство, которое возвращает размер файла;

stats.birthtime возвращает время и дату, когда данный файл был создан.

Модуль path и путь к файлу Node.js

Основной проблемой при работе с файлами и папками в операционных системах является разный синтаксис написания путей их расположения. Для решения этой проблемы в Node.js есть модуль path c набором полезных методов.

Для началы работы с модулем его нужно импортировать.

Получение имени, пути и расширения файла

Предположим, что в папке /temp лежит файл template.txt. Воспользуемся методами модуля path для получения имени файла, пути к нему, а так же его расширения.

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

path.basename(file, ‘.txt’) // tempalate

Метод dirname возвращает весь путь директории, где лежит файл и имеет один параметр, в который передается путь к файлу.

Метод extname возвращает расширение переданного файла.

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

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

Метод join принимает список параметров, объединяет их в одну строку, используя разделитель, подходящий к конкретной операционной системе, в которой будет исполнятся код.

Метод resolve используется для нахождения абсолютных путей к файлу.

Метод normalize позволяет найти путь к файлу, используя синтаксис переходов (.. и .) по папкам.

Переименование файла или директории

Методы rename() и renameSync() первым параметром принимают путь к файлу, который нужно переименовать. Второй параметр отвечает за новое наименование файла.

Чтение файла

Если вторым параметром не указана кодировка, то возвращается Buffer. Эти методы полностью загружают файлы в память компьютера, что может сильно отразиться на производительности. Если размер файла большой, то стоит воспользоваться потоками fs.createReadStream()

Запись файла

Чтобы перезаписать контент файлов, используются методы writeFile и writeFileSync. Важный момент! Если файла, контент которого нужно перезаписать, не существует, то он будет создан автоматически.

Копирование файла

Методы copyFile() и copyFileSync() первым параметром принимают путь файла для копирования. Второй параметр принимает название пути и нового файла. Третьим параметром является колбэк функция, которая возвращает ошибку.

Удаление файла

Последнее, что мы рассмотрим в этой статье будут методы unlink() и unlinkSync(). Первым параметром методы принимают путь к удаляемому файлу. Второй параметр в методе unlink возвращает колбэк функцию с ошибкой.

Заключение

В данной статье мы разобрали работу Node.js с файлами, на примерах посмотрели основные полезные методы модулей fs и path. Исходный код вы сможете найти тут. Надеюсь данная статья была вам полезна. Учитесь, думайте, пишите код. Удачного кодинга, друзья!

Подписывайтесь на наш канал в Telegram и на YouTube для получения самой последней и актуальной информации.

NodeJS. Создание и удаление директорий.

Всем привет! В этой статье мы рассмотрим, как создавать и удалять директории в NodeJS.

В прошлой статье мы рассмотрели, как записывать и считывать текстовые файлы. Давайте теперь посмотрим, как их удалять.

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

Теперь давайте перейдем к директориям. Мы также можем делать это синхронно или асинхронно. Рассмотрим синхронный способ:

В скобочках мы указываем название директории. Если вы хотите удалить директорию, то используйте такой метод:

Чтобы делать эти же операции асинхронно, просто уберите слово Sync в названии метода.

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

Здесь мы создаем директорию, после этого читаем файл readme.txt, а потом данные из этого файла записываем в файл writeme.txt, который помещаем в только что созданную директорию. Вот так вот все просто!

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

Итак, в этой статье мы рассмотрели, как создавать и удалять директории в NodeJS.

Спасибо за внимание!


Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 2 ):

Михаил было бы супер если вы также написали цикл статей и по socket.io

Рекурсивное чтение папки в NodeJS

Одной из самых частых задач при работе с каталогами (директориями) в NodeJS является их рекурсивное чтение. Что это такое? Например, у вас есть папка, а в ней еще папка, а в ней еще - и так далее. И Вам необходимо прочитать содержимое корневой папки и всех дочерних, причем уровень вложенности может быть сколь угодно произвольным. Для того, чтобы вывести содержимое всех папок как раз и понадобится рекурсия - вызов функцией самой себя.

В примере кода для NodeJS ниже я покажу Вам как этого можно добиться.

Первый пример

/**
* Рекурсивно обходит папку и возвращает все найденные в ней файлы
* в виде одномерного массива абсолютный путей
*
* @param dir Корневая папка
* @returns массив строк - путей к файлам
*/
async function getFiles(dir)

// асинхронно читает содержимое директории
const subfolders = await readdir(dir);

// возвращает список всех путей к файлам
const files = await Promise.all(subfolders.map(async (subfolder) =>

// преобразует путь к файлу из относительного в абсолютный
const res = resolve(dir, subfolder);

// проверяет директория или файл
// если директория - рекурсивно вызывает саму себя
// в противном случае возвращает файл в массив
return (await stat(res)).isDirectory() ? getFiles(res) : res;
>));

// преобразует многомерный полученный массив путей в одномерный
return files.reduce((a, f) => a.concat(f), []);
>


// запускаем с текущей директорией
getFiles(__dirname)
.then(files => console.log(files)) // выводим массив путей
.catch(e => console.error(e)); // или ошибки в консоль

Второй пример:

/**
*
* @param dir папка, с которой начинается сканирование
* @returns
*/
async function getFiles(dir)

// читаем содержимое директории
const dirents = await readdir(dir, < withFileTypes: true >);

// как и в прошлом примере проходимся по папкам
// и, при необходимости рекурсивно вызываем функцию
const files = await Promise.all(dirents.map((dirent) => const res = resolve(dir, dirent.name);
return dirent.isDirectory() ? getFiles(res) : res;
>));

// преобразуем массив файлов в одномерный
return Array.prototype.concat(. files);
>


// тестируем
getFiles(__dirname)
.then(files => console.log(files))
.catch(err => console.error(err))

Вот таким образом, можно рекурсивно обойти все директории и найти полные пути ко всем файлам в NodeJS.


Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 0 ):

Читайте также: