🗄️ 4 базовых функции для работы с файлами в Node.js
В Node.js программно манипулировать файлами можно с помощью встроенного модуля fs, содержащего функции, необходимые для чтения, записи, удаления и перемещения файлов на сервере. Рассмотрим эти функции в действии.
Перед чтением инструкции убедитесь, что у вас уже установлен Node.js. Для работы с файлами используются промисы с синтаксисом async/await .
Шаг 1. Читаем файлы с помощью readFile()
В каждом из следующих примеров мы сначала импортируем модуль fs – стандартный
Node.js модуль для работы с файлами. В первом примере мы воспользуемся функцией readFile() – прочитаем файл, сохраним содержимое в
переменной и выведем результат в консоль.
Начнем с
настройки среды. Создадим папку node-files для хранения проекта:
mkdir node-files cd node-files
В этой папке создадим текстовый файл greetings.txt для тестирования работы нашей программы:
echo "hello, hola, bonjour, hallo" > greetings.txt
Команда echo выводит строковый аргумент в терминал, а символ > перенаправляет вывод в файл greetings.txt.
Cоздадим и
откроем в текстовом редакторе файл readFile.js. Например, с помощью
nano:
nano readFile.js
Начнем с импорта внутри файла программы модуля fs:
const fs = require('fs').promises;
Когда модуль fs только
создавался, основным способом написания асинхронного кода в Node.js были коллбэки. Но по мере роста популярности промисов, команда Node.js поработала и над их поддержкой в модуле fs.
Создадим асинхронную функцию для чтения файла. Такие функции начинаются с
ключевого слова async. С помощью функции можно разрешать промисы,
используя await, вместо того чтобы связывать промис с помощью метода .then().
const fs = require('fs').promises;
async function readFile(filePath) {
try {
const data = await fs.readFile(filePath);
console.log(data.toString());
} catch (error) {
console.error(`Got an error trying to read the file: ${error.message}`);
}
}
Чтобы ловить ошибки
асинхронного чтения файлов, заключаем вызов fs.readFile() в блок
try...catch.
По умолчанию fs.readFile()
возвращает объект, который может хранить файлы любого типа. Когда журналируется
содержимое файла, все байты преобразуются в текст с помощью метода toString().
Если обнаружена ошибка (если файл не найден или нет прав на чтение), в консоль выведется соответствующее сообщение.
Осталось лишь вызвать функцию.
const fs = require('fs').promises;
async function readFile(filePath) {
try {
const data = await fs.readFile(filePath);
console.log(data.toString());
} catch (error) {
console.error(`Got an error trying to read the file: ${error.message}`);
}
}
readFile('greetings.txt');
Сохраняем файл программы и выходим из редактора. Запускаем скрипт:
node readFile.js
Получаем следующий результат:
hello, hola, bonjour, hallo
Шаг 2. Запись файлов с помощью writeFile()
Создадим другой программный файл writeFile.js:
nano writeFile.js
В этом примере мы напишем две функции: первая будет создавать CSV-файл, а вторая – добавлять в него данные.
Вставим в файл следующий код:
const fs = require('fs').promises;
async function openFile() {
try {
const csvHeaders = 'name,quantity,price'
await fs.writeFile('groceries.csv', csvHeaders);
} catch (error) {
console.error(`Got an error trying to write to a file: ${error.message}`);
}
}
Сначала функция openFile() создает
переменную csvHeaders, содержащую заголовки столбцов CSV-файла, а затем использует
функцию fs.writeFile() для создания файла и записи в него данных. Первый аргумент –
путь к файлу. Поскольку мы указали только имя, Node.js создаст файл в том же
каталоге, в котором мы выполняем код. Второй аргумент – записываемые данные. Создадим еще одну функцию для добавления данных в конец файла:
const fs = require('fs').promises;
async function openFile() {
try {
const csvHeaders = 'name,quantity,price'
await fs.writeFile('groceries.csv', csvHeaders);
} catch (error) {
console.error(`Got an error trying to write to a file: ${error.message}`);
}
}
async function addGroceryItem(name, quantity, price) {
try {
const csvLine = `\n${name},${quantity},${price}`
await fs.writeFile('groceries.csv', csvLine, { flag: 'a' });
} catch (error) {
console.error(`Got an error trying to write to a file: ${error.message}`);
}
}
Асинхронная функция
addGroceryItem() принимает три аргумента: название товара, сумму и цену за
единицу. Эти аргументы используются с шаблонным литеральным синтаксисом для
формирования переменной csvLine, записываемой в файл.
Затем, как и в функции openFile(), используется
метод writeFile(), но на этот раз есть третий
аргумент: объект JavaScript c ключом flag и значением 'a' . Так мы сообщаем Node.js, что данные нужно добавить в конец файла. По умолчанию флаг имеет значение 'w', при котором создается новый файл,
если он не существует, иначе файл перезаписывается. Вы можете узнать больше о
флагах файловой системы в документации Node.js.
Для завершения скрипта добавим в конец файла программы следующие строки:
(async function () {
await openFile();
await addGroceryItem('eggs', 12, 1.50);
await addGroceryItem('nutella', 1, 4);
})();
Запускаем код:
node writeFile.js
В текущем каталоге будет создан новый файл groceries.csv.
cat groceries.csv
Содержимое файла groceries.csv следующее:
name,quantity,price eggs,12,1.5 nutella,1,4
Вызов openFile() создал
новый файл и добавил заголовки столбцов. Последующие вызовы
addGroceryItem() добавляют две строки с данными.
Шаг 3. Удаление файлов с помощью unlink()
На этом шаге мы научимся удалять файлы с помощью функции unlink() модуля fs и напишем Node.js скрипт для
удаления groceries.csv, созданного на предыдущем шаге. Создадим новый программный файл deleteFile.js:
nano deleteFile.js
Напишем в программном файле код, создающий
асинхронную функцию deleteFile(), которая принимает путь к файлу в
качестве аргумента и передает его функции fs.unlink(), чтобы та удалила файл из файловой системы:
const fs = require('fs').promises;
async function deleteFile(filePath) {
try {
await fs.unlink(filePath);
console.log(`Deleted ${filePath}`);
} catch (error) {
console.error(`Got an error trying to delete the file: ${error.message}`);
}
}
deleteFile('groceries.csv');
unlink(), он не отправляется в recycle.bin или корзину, а навсегда удаляется из файловой системы. Это действие необратимо.Сохраняем файл и запускаем код:
node deleteFile.js
На выходе получаем следующее:
Deleted groceries.csv
Чтобы убедиться, что
файла больше нет, используем команду ls:
ls deleteFile.js greetings.txt readFile.js writeFile.js
Шаг 4. Перемещение файлов с помощью rename()
Напоследок рассмотрим функцию перемещения. Перед тем как начать, создадим папку test-data, в которую будем перемещать файл:
mkdir test-data
Скопируем файл:
cp greetings.txt greetings-2.txt
Откроем для редактирования программный файл:
nano moveFile.js
Создадим функцию
moveFile(), вызывающую rename(). В ней необходимо указать путь к местоположению
исходного и целевого файлов.
const fs = require('fs').promises;
async function moveFile(source, destination) {
try {
await fs.rename(source, destination);
console.log(`Moved file from ${source} to ${destination}`);
} catch (error) {
console.error(`Got an error trying to move the file: ${error.message}`);
}
}
moveFile('greetings-2.txt', 'test-data/salutations.txt');
Функция rename() может переместить файл в другую папку, переименовать файл в текущем каталоге или сделать и то, и другое одновременно, как в нашем коде.
Сохраним и запустим код:
node moveFile.js
В ответ получаем следующее:
Moved file from greetings-2.txt to test-data/salutations.txt
Подтвердим успех операции:
ls deleteFile.js greetings.txt moveFile.js readFile.js test-data writeFile.js
Заключение
Мы изучили функции управления файлами с помощью Node.js. Сначала загрузили содержимое файла функцией readFile(). Затем создали новый файл и добавили в него данные с помощью writeFile(), удалили файл с unlink(), а затем переместили и переименовали файл посредством rename().
С помощью функций модуля fs разработчики могут контролировать использование файлов в программах Node.js. Кстати, у нас есть и другие полезные материалы по теме Node.js:
- Платформа Node.js: руководство по эксплуатации для начинающих
- Подборка бесплатных ресурсов для изучения Node.js
- Зачем и как строить IoT с Node.js
- Node.js Handbook: полезные ссылки и туториалы