Урок 32: Работа с файлами в Node.js
В Node.js работа с файлами осуществляется с помощью встроенного модуля fs
(file system). Этот модуль предоставляет различные методы для чтения, записи, удаления и управления файлами и директориями. В этом уроке мы рассмотрим, как выполнять основные операции с файлами в Node.js, а также как использовать асинхронные методы для эффективной работы с файлами.
Чтение файлов
Для чтения файлов в Node.js используется метод fs.readFile
. Этот метод асинхронно читает содержимое файла и возвращает его в виде буфера или строки.
// Импорт модуля fs
const fs = require('fs');
// Чтение файла
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
console.error('Ошибка чтения файла:', err);
return;
}
console.log('Содержимое файла:', data);
});
// Содержимое файла: (вывод содержимого файла)
Запись в файл
Для записи данных в файл используется метод fs.writeFile
. Этот метод асинхронно записывает данные в файл, создавая его, если он не существует.
// Запись в файл
fs.writeFile('output.txt', 'Hello, Node.js!', 'utf8', (err) => {
if (err) {
console.error('Ошибка записи в файл:', err);
return;
}
console.log('Данные успешно записаны в файл');
});
// Данные успешно записаны в файл
Асинхронные операции с файлами
Асинхронные методы модуля fs
позволяют выполнять операции с файлами без блокировки основного потока. Это особенно полезно при работе с большими файлами или выполнении большого количества операций ввода-вывода.
Рассмотрим пример использования асинхронного метода fs.readFile
и fs.writeFile
для чтения данных из одного файла и записи их в другой файл.
// Чтение данных из файла и запись их в другой файл
fs.readFile('input.txt', 'utf8', (err, data) => {
if (err) {
console.error('Ошибка чтения файла:', err);
return;
}
fs.writeFile('output.txt', data, 'utf8', (err) => {
if (err) {
console.error('Ошибка записи в файл:', err);
return;
}
console.log('Данные успешно скопированы из input.txt в output.txt');
});
});
// Данные успешно скопированы из input.txt в output.txt
Использование промисов и async/await
Для удобства работы с асинхронными операциями можно использовать промисы и async/await. Рассмотрим, как переписать предыдущий пример с использованием промисов и async/await.
// Импорт модуля fs и преобразование методов в промисы
const fs = require('fs').promises;
async function copyFile() {
try {
const data = await fs.readFile('input.txt', 'utf8');
await fs.writeFile('output.txt', data, 'utf8');
console.log('Данные успешно скопированы из input.txt в output.txt');
} catch (err) {
console.error('Ошибка:', err);
}
}
copyFile();
// Данные успешно скопированы из input.txt в output.txt
В этом примере мы используем модуль fs
с промисами и async/await для выполнения асинхронных операций чтения и записи файлов.
Упражнения
Упражнение 1: Чтение и запись файлов
Создайте скрипт, который читает содержимое файла data.txt
, преобразует все символы в верхний регистр и записывает результат в новый файл uppercase.txt
.
Решение:
// Импорт модуля fs
const fs = require('fs');
// Чтение и преобразование данных
fs.readFile('data.txt', 'utf8', (err, data) => {
if (err) {
console.error('Ошибка чтения файла:', err);
return;
}
const upperCaseData = data.toUpperCase();
fs.writeFile('uppercase.txt', upperCaseData, 'utf8', (err) => {
if (err) {
console.error('Ошибка записи в файл:', err);
return;
}
console.log('Данные успешно записаны в файл uppercase.txt');
});
});
// Данные успешно записаны в файл uppercase.txt
Объяснение: Мы прочитали содержимое файла data.txt
, преобразовали его в верхний регистр и записали результат в файл uppercase.txt
.
Упражнение 2: Асинхронное чтение и запись файлов с использованием async/await
Создайте скрипт, который читает содержимое файла info.txt
, добавляет к каждому строковому значению дату и время, и записывает результат в новый файл info_with_timestamp.txt
. Используйте async/await для выполнения асинхронных операций.
Решение:
// Импорт модуля fs и преобразование методов в промисы
const fs = require('fs').promises;
async function addTimestamp() {
try {
const data = await fs.readFile('info.txt', 'utf8');
const lines = data.split('\n');
const timestampedLines = lines.map(line => `${line} - ${new Date().toLocaleString()}`);
const outputData = timestampedLines.join('\n');
await fs.writeFile('info_with_timestamp.txt', outputData, 'utf8');
console.log('Данные успешно записаны в файл info_with_timestamp.txt');
} catch (err) {
console.error('Ошибка:', err);
}
}
addTimestamp();
// Данные успешно записаны в файл info_with_timestamp.txt
Объяснение: Мы прочитали содержимое файла info.txt
, добавили к каждому строковому значению текущую дату и время, и записали результат в файл info_with_timestamp.txt
с использованием async/await.