Node.JS 5: Modul File System

V minulé epizodě jsme si vytvořili první funkční server. Nicméně data na tomto serveru zůstávala statická. Pokud bychom chtěli upravit soubory a vytvořit dynamickou SPA, použijeme pro manipulaci modul fs.

const fs = require('fs');

Častá využití modulu fs:

  • pročítání souborů
  • vytváření souborů
  • aktualizování souborů
  • přejmenovávání souborů
  • vymazávání souborů

Pročítání souborů

Vytvoříme si libovolný HTML dokument (např. já osobně si vytvořím index.html):

<!DOCTYPE html>
<html lang="cs">
<head>
    <meta charset="UTF-8">
    <title>Zkušební soubor</title>
</head>
<body>
<h1>Zkušební soubor...</h1>
</body>
</html>

Nyní se přesuneme do app.js(návod na vytvoření tohoto dokumentu najdete ve článku o vlastním serveru ). Do funkce main zanoříme metodu fs.readFile(), do které jako argument dosadíme další funkci (s parametry err a data). Mezi důležité změny patří změna z {"Content-Type":"text/plain"} na {"Content-Type":"text/html"}:

function main(req,res) {
    fs.readFile('index.html',function (err,data) {
        res.writeHead(404, {"Content-Type":"text/html"});
        res.write(data);
        res.end();
    });

}

let srv = http.createServer(main);
srv.listen(PORT);

console.log("Server běží na adrese http://localhost:" + PORT);

Kód naleznete na GitHubu ve složce Node.JS - index.html a app.js .

Vytváření nových souborů

S modulem fs můžeme vytvořit nové dokumenty pomocí metod:

  1. fs.appendFile()
  2. fs.writeFile()
  3. fs.open()

Metody umisťujeme mimo hlavní funkci main()

1. fs.appendFile() - tuto metodu nejčastěji využijeme, když chceme jednoduše vytvořit nový soubor. Pokud ji zavoláme znova, a soubor je již vytvořen, dopíše se do něj dodatečně další "Ahoj světe!".

fs.appendFile('mujnovysoubor.txt', 'Ahoj světe!', function(err){
    if (err) throw err;
    console.log('Uloženo!');
});

Kód pro *fs.appendFile() na GitHubu.

2. fs.writeFile() - Tato metoda má stejnou syntaxi, jako fs.appendFile. V čem je tedy rozdíl? Pokud již soubor existuje,po zavolání fs.appendFile se připíše další obsah (např. se podruhé vypíše "Ahoj světe!"), u fs.writeFile ale dojde k úplnému přepsání (např. předešlý text "Ahoj světe!" se přepíše na námi určený "Dobrý den!".

fs.writeFile('mujnovysoubor.txt', 'Dobrý den!', function(err){
    if (err) throw err;
    console.log('Uloženo!');
});

3. fs.open() . v porovnání s fs.appendFile() a fs.writeFile můžeme v parametru funkce určovat tzv. flagy (flag - doslovně přeloženo vlajka, praporek). Pokud se stane hodnotou flagu w(jako write), znamená to, že se vytvoří dokument (pokud podobný se stejným jménem neexistuje), hodí se pro upravování. Pokud flag nabude hodnoty r (jako read), nový soubor se nevytvoří. fs.read tak zastupuje jak funkčnost fs.write, tak i fs.read.

fs.open('mujnovysoubor2.txt', 'w', function(err){
    if (err){
        return console.error(err);
    } else {
 /*...*/
} 
    console.log("Uloženo!");
});

Přehled flagů:

  • r - otevře soubor pro čtení (srov. fs.readFile()
  • r+ - otevře soubor pro čtení a psaní - stejná funkčnost jako w+
  • w - otevře pro psaní
  • wx - otevře pro psaní, ale pokud soubor neexistuje, nefunguje
  • wx+ - otevře soubor pro čtení a psaní, ale pokud neexistuje, nefunguje
  • a - otevře soubor pro připojení dalších dat (srov. fs.appendFile())
  • ax - otevře soubor pro připojování dalších dat, ale nefunguje, pokud daný soubor neexistuje (nevytvoří nový)
  • a+ - otevře soubor pro připojování dalších souborů a pro čtení
  • ax+ - otevře soubor pro čtení a připojování dalších dat, ale nefunguje, pokud již volaný soubor neexistuje

Do konzole se vypíše:

Uloženo!

Kód pro *fs.openFile() na GitHubu.

Aktualizování souborů

Pozměnit můžeme soubory již známými fs.appendFile a fs.writeFile. fs.appendFile() přiloží další část k soubboru - např. další větu, zatímco fs.writeFile() kompletně přepíše soubor:

fs.writeFile('mujnovysoubor.txt', 'Toto je nový text!', function(err){
    if (err) throw err;
    console.log('Uloženo!');
});

Obsah dokumentu mujnovysoubor.txt:

Toto je nový text!

Pokud však soubor obshauje již nějaká data (např. "Toto je můj nový text!" od metody fs.writeFile() ) a my chceme přidat dalš, aniž bychom vymazali předešlá:

fs.appendFile('mujnovysoubor.txt', 'Toto je ještě novější text!', function(err){
    if (err) throw err;
    console.log('Uloženo!');
});

Soubor mujnovysoubor.txt nyní obsahuje data:

Toto je nový text!Toto je ještě novější text!

Přejmenovávání souborů

Na přejmenovávání existuje speciální metoda fs.rename():

fs.rename('mujnovysoubor.txt', 'mujnovyprejmenovanysoubor.txt', function (err) {
    if (err){
        return console.error(err);
    }
    console.log("Přejmenováno!")
});

Vymazávání souborů

Pokud se rozhodneme vymazat daný soubor, nabízí se metoda fs.unlink():

fs.unlink('mujnovysoubor20.txt', function (err) {
    if (err){
        return console.error(err);
    }
    console.log("Vymazáno!");
});

Kód pro *fs.unlink() na GitHubu.