Модуль fs Node.js

Java FileВстроенные модули 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-модуля

Основные методы модуля fs

1. Чтение файлов

Синхронное чтение файла (readFileSync)

Пример

const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
  • 'example.txt': путь к файлу для чтения
  • 'utf8': укажите формат кодировки (необязательно)
  • Синхронные методы блокируют выполнение кода до завершения чтения файла

Чтение файла асинхронно (readFile)

Пример

fs.readFile('example.txt', 'utf8', (err, 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('Файл сохранён');
});

3. Дозапись в файл

Синхронное добавление (appendFileSync)

Пример

fs.appendFileSync('log.txt', 'Новое содержимое лога\n');

Асинхронное добавление (appendFile)

Пример

fs.appendFile('log.txt', 'Новое содержимое лога\n', (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()}`);
});

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

Удаление синхронно (unlinkSync)

Пример

fs.unlinkSync('fileToDelete.txt');

Удаление асинхронно (unlink)

Пример

fs.unlink('fileToDelete.txt', (err) => {
  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();

Файловые операции на основе потоков

Для больших файлов использование потоков может повысить производительность:

Поток чтения

Пример

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);
});

Поток записи

Пример

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);
});

Операции с каталогами

Создание каталога

Пример

fs.mkdir('newFolder', (err) => {
  if (err) throw err;
  console.log('Каталог создан');
});

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

Пример

fs.readdir('./', (err, files) => {
  if (err) throw err;
  console.log('Содержимое текущего каталога:', files);
});

Удаление каталога

Пример

fs.rmdir('emptyFolder', (err) => {
  if (err) throw err;
  console.log('Каталог удалён');
});

Лучшие практики

  1. Предпочитайте использовать асинхронные методы: избегайте блокировки цикла событий
  2. Обработка ошибок: всегда обрабатывайте возможные ошибки
  3. Используйте потоки для обработки больших файлов: повышайте производительность
  4. Обработка путей: используйте модуль path для обработки проблем с путями на разных платформах
  5. Проверка прав: проверяйте права доступа к файлам/каталогам перед операциями

Примеры практического применения

Функциональность копирования файлов

Пример

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');
});

Java FileВстроенные модули Node.js

Другие расширения