Waarom bestanden?

  • Configuratie bewaren (bv. .json)
  • Logs bijhouden
  • Data delen tussen programma’s
  • Kleine “database” zonder extra software

Voorbereiding

  1. Maak een map: bestanden-les/
  2. Maak daarbinnen: app.js en een map data/
  3. Open de map in je editor en terminal

Belangrijke modules

  • fs — File System API
  • path — paden opbouwen, onafhankelijk van OS
const fs = require('fs')
const path = require('path')

Veilig pad maken

Gebruik __dirname + path.join() i.p.v. losse strings.

const filePath = path.join(__dirname, 'data', 'bericht.txt')
console.log(filePath) // bv. /Users/jij/bestanden-les/data/bericht.txt

Bestand lezen — basis

fs.readFile leest een geheel bestand in geheugen (callback-stijl).

const filePath = path.join(__dirname, 'data', 'bericht.txt')

fs.readFile(filePath, 'utf8', (err, inhoud) => {
  if (err) {
    console.error('Lezen mislukt:', err.message)
    return
  }
  console.log('Inhoud:', inhoud)
})

Let op: gebruik 'utf8' om tekst te krijgen i.p.v. een Buffer.

Fouten begrijpen

  • ENOENT — bestand bestaat niet
  • EACCES — geen rechten
  • EISDIR — je probeert een map te lezen als bestand

Bestand schrijven — basis

fs.writeFile creëert of overschrijft een bestand.

const outPath = path.join(__dirname, 'data', 'output.txt')

fs.writeFile(outPath, 'Eerste regel\n', 'utf8', (err) => {
  if (err) {
    console.error('Schrijven mislukt:', err.message)
    return
  }
  console.log('Bestand opgeslagen:', outPath)
})

Toevoegen i.p.v. overschrijven

Gebruik fs.appendFile om onderaan bij te schrijven.

const logPath = path.join(__dirname, 'data', 'app.log')

fs.appendFile(logPath, 'Nieuw logitem\n', 'utf8', (err) => {
  if (err) return console.error('Append mislukt:', err.message)
    console.log('Log bijgewerkt')
})

Mappen aanmaken

fs.mkdir met recursive: true maakt tussenliggende mappen.

const dirPath = path.join(__dirname, 'data', 'uploads')

fs.mkdir(dirPath, { recursive: true }, (err) => {
  if (err) return console.error('Kon map niet maken:', err.message)
    console.log('Map klaar:', dirPath)
})

Bestanden oplijsten

fs.readdir geeft namen in een map terug.

const dataDir = path.join(__dirname, 'data')

fs.readdir(dataDir, (err, items) => {
  if (err)
    return console.error('readdir fout:', err.message)
  items.forEach((naam) => console.log('•', naam))
})

Bestand hernoemen / verplaatsen

fs.rename kan ook verplaatsen (naar andere map).

const oud = path.join(__dirname, 'data', 'output.txt')
const nieuw = path.join(__dirname, 'data', 'output-old.txt')
fs.rename(oud, nieuw, (err) => {
  if (err) return console.error('rename fout:', err.message)
    console.log('Bestand hernoemd.')
})

Bestand verwijderen

Gebruik fs.unlink (let op: definitief).

const weg = path.join(__dirname, 'data', 'weg.txt')

fs.unlink(weg, (err) => {
  if (err) {
    if (err.code === 'ENOENT') console.log('Bestand bestond niet.')
      else console.error('unlink fout:', err.message)
      return
    }
  console.log('Bestand verwijderd.')
})

Oefening 1 — Lezen > printen

  1. Maak data/bericht.txt met een paar regels tekst.
  2. Schrijf code die het bestand leest en elke regel met een nummertje logt.
  3. Tip: inhoud.split('\n').

Oefening 2 — Schrijven > overschrijven

  1. Maak code die data/output.txt overschrijft met 3 regels.
  2. Voer uit, open het bestand en controleer de inhoud.

Oefening 3 — Loggen met append

  1. Maak een functie log(bericht) die naar data/app.log schrijft.
  2. Elke call voegt een nieuwe regel toe met timestamp.
  3. Tip: new Date().toISOString() en fs.appendFile.