Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Як записати дані у файл?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Основні способи: `fs.writeFile()` (callback, перезаписує), `fs/promises.writeFile()` (сучасний, через `await`), `fs.appendFile()` (дописує в кінець), `fs.createWriteStream()` (для великих обсягів даних) і `fs.writeFileSync()` (блокує потік, лише для CLI). **Ключове:** `writeFile` завжди перезаписує вміст, тоді як `appendFile` дописує - обирай метод залежно від того, чи потрібно зберегти попередній вміст.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 1. Асинхронний запис (через callback) Це класичний спосіб, не блокує потік - підходить для серверів. ```javascript import fs from 'fs'; fs.writeFile('./output.txt', 'Привіт, Node.js!', (err) => { if (err) { console.error('Помилка запису:', err); return; } console.log('Файл успішно записано!'); }); ``` - Якщо файл **не існує** - Node створить його. - Якщо файл **уже є** - вміст **перезапишеться**. - Можна передати третій параметр (`options`), наприклад `{ flag: 'a' }` для додавання (див. нижче). ## 2. Асинхронний запис із промісами (`fs/promises`) Сучасний, читабельний і рекомендований варіант. Працює з `async/await`, без callback-ів. ```javascript import { writeFile } from 'fs/promises'; try { await writeFile('./output.txt', 'Hello from fs/promises!'); console.log('Файл створено!'); } catch (err) { console.error('Помилка:', err); } ``` Можна додати опції: ```javascript await writeFile('./log.txt', 'Перший рядок\n', { flag: 'a' }); // "append" ``` ## 3. Додавання (append) даних у кінець файлу Якщо потрібно **дописувати** дані, а не перезаписувати: ```javascript import fs from 'fs'; fs.appendFile('./log.txt', 'Новий запис\n', (err) => { if (err) throw err; console.log('Запис додано!'); }); ``` чи з `await`: ```javascript import { appendFile } from 'fs/promises'; await appendFile('./log.txt', 'Додали ще рядок\n'); ``` ## 4. Синхронний запис (блокуючий) Використовується рідко (наприклад, при завантаженні конфігурацій). Блокує event loop - **не рекомендується** для серверних застосунків. ```javascript import fs from 'fs'; try { fs.writeFileSync('./output.txt', 'Синхронний запис'); console.log('Файл записано!'); } catch (err) { console.error(err); } ``` Поки файл не запишеться - виконання програми зупинено. ## 5. Потоковий запис (для великих файлів) Якщо потрібно записувати **багато даних** (наприклад, лог чи великий JSON), краще використовувати **потоки** (`streams`). ```javascript import fs from 'fs'; const stream = fs.createWriteStream('./bigdata.txt'); stream.write('Перший рядок\n'); stream.write('Другий рядок\n'); stream.end('Файл завершено!\n'); stream.on('finish', () => console.log('Запис завершено!')); stream.on('error', (err) => console.error('Помилка:', err)); ``` Переваги потоків: - Запис іде частинами, не завантажуючи всю пам'ять; - Можна використовувати для **стримінгу HTTP-відповідей** чи **логування**. ## 6. Параметри запису (`options`) Методи `writeFile`, `appendFile`, `createWriteStream` приймають об'єкт налаштувань: ```javascript { encoding: 'utf8', // кодування mode: 0o666, // права доступу до файлу flag: 'w' // режим: 'w' = запис, 'a' = додавання, 'wx' = запис, якщо файлу немає } ``` Приклад: ```javascript await writeFile('./data.txt', 'Test', { flag: 'a', encoding: 'utf8' }); ``` ## 7. Приклад: запис об'єкта в JSON-файл ```javascript import { writeFile } from 'fs/promises'; const user = { name: 'Tim', age: 28 }; await writeFile('./user.json', JSON.stringify(user, null, 2)); console.log('JSON збережено!'); ``` - `JSON.stringify(..., null, 2)` робить гарний формат із відступами. - Якщо потрібно оновити - читай файл → парси → онови → знову `writeFile`. ## 8. Перевірка існування перед записом ```javascript import fs from 'fs'; if (fs.existsSync('./data.txt')) { console.log('Файл уже існує!'); } else { fs.writeFileSync('./data.txt', 'Створено новий файл'); } ``` Чи асинхронно: ```javascript import { access, writeFile } from 'fs/promises'; import { constants } from 'fs'; try { await access('./data.txt', constants.F_OK); console.log('Файл уже є'); } catch { await writeFile('./data.txt', 'Створено автоматично'); } ``` ## 9. Приклад "логера" (реальний кейс) ```javascript import { appendFile } from 'fs/promises'; async function log(message) { const timestamp = new Date().toISOString(); await appendFile('./server.log', `[${timestamp}] ${message}\n`); } await log('Сервер запущено'); await log('Користувач увійшов'); ``` Відмінно підходить для ведення логів без бібліотек. ## 10. Зведена таблиця | Метод | Асинхронність | Перезаписує | Додає | Потоковий | Рекомендується | |---|---|---|---|---|---| | `fs.writeFile` | Так | Так | Ні | Ні | Так | | `fs/promises.writeFile` | Так (`await`) | Так | Ні | Ні | Так, найкраще | | `fs.appendFile` | Так | Ні | Так | Ні | Так | | `fs.createWriteStream` | Так | Налаштовується | Так | Так | Так (великі дані) | | `fs.writeFileSync` | Ні | Так | Ні | Ні | Лише для CLI |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.