Modul fs: Membaca & Menulis Berkas
Bekerja dengan berkas dan folder memakai fs: baca, tulis, tambah, cek keberadaan, daftar folder, dan JSON.
fs: file system
Modul fs memberi akses ke berkas dan folder. Hampir setiap fungsi punya tiga bentuk:
| Bentuk | Contoh | Sifat |
|---|---|---|
| Sinkron | fs.readFileSync(p) | Memblokir sampai selesai; melempar error |
| Callback | fs.readFile(p, cb) | Asinkron, error-first |
| Promise | fs.promises.readFile(p) / require('fs/promises') | Asinkron, async/await |
Di bab ini kita memakai versi sinkron karena paling sederhana untuk skrip kecil dan konfigurasi saat startup. Di server yang melayani banyak pengguna, gunakan versi asinkron (bab berikutnya) agar event loop tidak terblokir.
Membaca dan menulis
const fs = require('fs');
fs.writeFileSync('catatan.txt', 'Baris pertama\n'); // buat / TIMPA berkas
fs.appendFileSync('catatan.txt', 'Baris kedua\n'); // tambah di akhir
const isi = fs.readFileSync('catatan.txt', 'utf8'); // baca sebagai teks
console.log(isi.split('\n'));
Tanpa argumen encoding ('utf8'), readFileSync mengembalikan Buffer (data biner), bukan string.
Keberadaan, folder, dan hapus
fs.existsSync('catatan.txt'); // true / false
fs.mkdirSync('laporan/2026', { recursive: true }); // buat folder bertingkat
fs.readdirSync('.'); // daftar nama isi folder
fs.statSync('catatan.txt').size; // ukuran dalam byte
fs.statSync('laporan').isDirectory(); // true
fs.renameSync('lama.txt', 'baru.txt');
fs.unlinkSync('baru.txt'); // hapus berkas
fs.rmSync('laporan', { recursive: true, force: true }); // hapus folder
Menangani error
Operasi fs bisa gagal: berkas tidak ada, tidak ada izin, folder bukan berkas. Error membawa properti code yang bisa dibedakan:
try {
fs.readFileSync('tidak-ada.txt', 'utf8');
} catch (err) {
if (err.code === 'ENOENT') console.log('Berkas tidak ditemukan');
else throw err; // error lain: jangan ditelan
}
| Kode | Arti |
|---|---|
ENOENT | Berkas/folder tidak ada |
EEXIST | Sudah ada |
EACCES | Tidak punya izin |
EISDIR | Ternyata sebuah folder |
ENOTEMPTY | Folder tidak kosong |
JSON: format konfigurasi yang paling umum
const konfig = JSON.parse(fs.readFileSync('konfig.json', 'utf8'));
konfig.pajak = 0.12;
fs.writeFileSync('konfig.json', JSON.stringify(konfig, null, 2));
Jalur relatif dan __dirname
Ingat dari bab path: 'catatan.txt' dihitung dari folder kerja proses, bukan folder skrip. Pakai path.join(__dirname, 'catatan.txt') bila lokasinya harus tetap.
Kapan berkas besar jadi masalah?
readFileSync memuat seluruh berkas ke memori. Untuk berkas besar (ratusan MB), gunakan stream (bab selanjutnya).