Чтение и запись файлов
В браузере у JavaScript нет доступа к диску, а в Node.js есть. За работу с файлами отвечает встроенный модуль node:fs (fs — file system, файловая система). Его версия node:fs/promises возвращает промисы, поэтому результат получают через await — так, как вы привыкли в учебнике.
Запись файла
Функция writeFile() создаёт файл или полностью перезаписывает существующий:
import { writeFile } from 'node:fs/promises';
await writeFile('hello.txt', 'Первая статья блога\n');
console.log('Файл записан');После запуска рядом появится файл hello.txt с одной строкой. await можно писать прямо в модуле, без async-функции.
Чтение файла
Функция readFile() возвращает содержимое. Второй аргумент — кодировка: без него вернутся байты (объект Buffer), а не текст:
import { readFile, writeFile } from 'node:fs/promises';
await writeFile('hello.txt', 'Привет, файл!');
const text = await readFile('hello.txt', 'utf8');
console.log(text); // Привет, файл!Пример сначала создаёт файл, а затем читает его. Кодировку utf8 указывайте всегда, когда читаете текст.
Дозапись в конец
appendFile() добавляет текст в конец файла, не стирая прежний. Так удобно вести журнал событий:
import { appendFile, readFile, writeFile } from 'node:fs/promises';
await writeFile('blog.log', 'Сервер запущен\n');
await appendFile('blog.log', 'Добавлена статья 1\n');
await appendFile('blog.log', 'Добавлена статья 2\n');
console.log(await readFile('blog.log', 'utf8'));Выведутся три строки по порядку. Если файла нет, appendFile() создаст его.
Проверка, есть ли файл
Сведения о файле возвращает stat(): размер, дату изменения, файл это или папка:
import { stat, writeFile } from 'node:fs/promises';
await writeFile('hello.txt', 'Привет');
const info = await stat('hello.txt');
console.log(info.isFile()); // true
console.log(info.size); // 12Размер считается в байтах: каждая русская буква в кодировке UTF-8 занимает два байта.
Основные функции
| Функция | Что делает |
|---|---|
readFile(file, 'utf8') | Читает файл целиком |
writeFile(file, text) | Создаёт или перезаписывает файл |
appendFile(file, text) | Дописывает в конец |
stat(file) | Сведения о файле |
rename(from, to) | Переименовывает или переносит |
unlink(file) | Удаляет файл |
Частая ошибка
Чтение несуществующего файла бросает ошибку с кодом ENOENT (нет такого файла или папки). Если файла может не быть, перехватите её:
import { readFile } from 'node:fs/promises';
try {
await readFile('missing.txt', 'utf8');
} catch (error) {
console.log(error.code); // ENOENT
}И не забывайте await: без него вместо текста вы получите промис Promise { <pending> }.