Модуль fs Node.js
Модуль fs (File System) — это основной встроенный модуль в Node.js, используемый для взаимодействия с файловой системой.
Модуль fs предоставляет ряд методов для обработки файловых операций, таких как чтение, запись и удаление.
Модуль fs — один из наиболее часто используемых модулей в разработке на Node.js, особенно в сценариях, где требуется обработка локальных файлов.
Как использовать модуль fs?
Чтобы использовать модуль fs, сначала нужно импортировать его:
const fs = require('fs');
Начиная с Node.js 14, вы также можете использовать синтаксис импорта ES6:
Пример
const fs = require('fs'); // метод CommonJS
// или
import fs from 'fs'; // метод ES-модуля
// или
import fs from 'fs'; // метод ES-модуля
Основные методы модуля fs
1. Чтение файлов
Синхронное чтение файла (readFileSync)
Пример
const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
console.log(data);
'example.txt': путь к файлу для чтения'utf8': укажите формат кодировки (необязательно)- Синхронные методы блокируют выполнение кода до завершения чтения файла
Чтение файла асинхронно (readFile)
Пример
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
if (err) throw err;
console.log(data);
});
- Асинхронные методы не блокируют выполнение кода
- Обработка результатов через функции обратного вызова
- Функция обратного вызова с первым аргументом-ошибкой — распространённый шаблон в Node.js
2. Запись файла
Запись файла синхронно (writeFileSync)
Пример
fs.writeFileSync('output.txt', 'Hello, Node.js!');
Запись файла асинхронно (writeFile)
Пример
fs.writeFile('output.txt', 'Привет, Node.js!', (err) => {
if (err) throw err;
console.log('Файл сохранён');
});
if (err) throw err;
console.log('Файл сохранён');
});
3. Дозапись в файл
Синхронное добавление (appendFileSync)
Пример
fs.appendFileSync('log.txt', 'Новое содержимое лога\n');
Асинхронное добавление (appendFile)
Пример
fs.appendFile('log.txt', 'Новое содержимое лога\n', (err) => {
if (err) throw err;
});
if (err) throw err;
});
4. Проверка состояния файла (stat)
Пример
fs.stat('example.txt', (err, stats) => {
if (err) throw err;
console.log(`Размер файла: ${stats.size} bytes`);
console.log(`Время создания: ${stats.birthtime}`);
console.log(`Является ли файлом: ${stats.isFile()}`);
console.log(`Является ли каталогом: ${stats.isDirectory()}`);
});
if (err) throw err;
console.log(`Размер файла: ${stats.size} bytes`);
console.log(`Время создания: ${stats.birthtime}`);
console.log(`Является ли файлом: ${stats.isFile()}`);
console.log(`Является ли каталогом: ${stats.isDirectory()}`);
});
5. Удаление файла
Удаление синхронно (unlinkSync)
Пример
fs.unlinkSync('fileToDelete.txt');
Удаление асинхронно (unlink)
Пример
fs.unlink('fileToDelete.txt', (err) => {
if (err) throw err;
console.log('Файл удалён');
});
if (err) throw err;
console.log('Файл удалён');
});
Поддержка Promise и async/await
Node.js 10+ предоставляет модуль fs/promises, который поддерживает API в стиле Promise:
Пример
const fs = require('fs').promises;
async function readFile() {
try {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error('Ошибка чтения файла:', err);
}
}
readFile();
async function readFile() {
try {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error('Ошибка чтения файла:', err);
}
}
readFile();
Файловые операции на основе потоков
Для больших файлов использование потоков может повысить производительность:
Поток чтения
Пример
const readStream = fs.createReadStream('largeFile.txt', 'utf8');
readStream.on('data', (chunk) => {
console.log('Данные получены:', chunk.length);
});
readStream.on('end', () => {
console.log('Чтение завершено');
});
readStream.on('error', (err) => {
console.error('Ошибка чтения:', err);
});
readStream.on('data', (chunk) => {
console.log('Данные получены:', chunk.length);
});
readStream.on('end', () => {
console.log('Чтение завершено');
});
readStream.on('error', (err) => {
console.error('Ошибка чтения:', err);
});
Поток записи
Пример
const writeStream = fs.createWriteStream('output.txt');
writeStream.write('Первая строка данных\n');
writeStream.write('Вторая строка данных\n');
writeStream.end('Последняя строка данных');
writeStream.on('finish', () => {
console.log('Запись завершена');
});
writeStream.on('error', (err) => {
console.error('Ошибка записи:', err);
});
writeStream.write('Первая строка данных\n');
writeStream.write('Вторая строка данных\n');
writeStream.end('Последняя строка данных');
writeStream.on('finish', () => {
console.log('Запись завершена');
});
writeStream.on('error', (err) => {
console.error('Ошибка записи:', err);
});
Операции с каталогами
Создание каталога
Пример
fs.mkdir('newFolder', (err) => {
if (err) throw err;
console.log('Каталог создан');
});
if (err) throw err;
console.log('Каталог создан');
});
Чтение содержимого каталога
Пример
fs.readdir('./', (err, files) => {
if (err) throw err;
console.log('Содержимое текущего каталога:', files);
});
if (err) throw err;
console.log('Содержимое текущего каталога:', files);
});
Удаление каталога
Пример
fs.rmdir('emptyFolder', (err) => {
if (err) throw err;
console.log('Каталог удалён');
});
if (err) throw err;
console.log('Каталог удалён');
});
Лучшие практики
- Предпочитайте использовать асинхронные методы: избегайте блокировки цикла событий
- Обработка ошибок: всегда обрабатывайте возможные ошибки
- Используйте потоки для обработки больших файлов: повышайте производительность
- Обработка путей: используйте модуль path для обработки проблем с путями на разных платформах
- Проверка прав: проверяйте права доступа к файлам/каталогам перед операциями
Примеры практического применения
Функциональность копирования файлов
Пример
const fs = require('fs');
function copyFile(source, target, cb) {
const readStream = fs.createReadStream(source);
const writeStream = fs.createWriteStream(target);
readStream.on('error', cb);
writeStream.on('error', cb);
readStream.on('close', () => {
writeStream.end();
cb(null);
});
readStream.pipe(writeStream);
}
copyFile('source.txt', 'target.txt', (err) => {
if (err) return console.error('Copy failed:', err);
console.log('File copied successfully');
});
function copyFile(source, target, cb) {
const readStream = fs.createReadStream(source);
const writeStream = fs.createWriteStream(target);
readStream.on('error', cb);
writeStream.on('error', cb);
readStream.on('close', () => {
writeStream.end();
cb(null);
});
readStream.pipe(writeStream);
}
copyFile('source.txt', 'target.txt', (err) => {
if (err) return console.error('Copy failed:', err);
console.log('File copied successfully');
});
Другие расширения
Встроенные модули Node.js