15 Lis 2019

Foldery w nodejs - kilka przydatnych metod.

Poniżej kila przydanych właściwości przy pracy z folderami.

Tworzenie nowego foldera

Do tego wykorzystamy fs.mkdir() lub fs.mkdirSync() oraz fs.existsSync()

const fs = require('fs')

const folderName = '/test'

try {
  if (!fs.existsSync(folderName)) {
    fs.mkdirSync(folderName)
  }
} catch (err) {
  console.error(err)
}

Najpierw sprawdzamy czy folder istnieje metodą !fs.existsSync(), a następnie tworzymy folder przez fs.mkdirSync().
Czym się różnią te dwie metody, fs.mkdir() od fs.mkdirSync().
fs.mkdir() jest asynchroniczne a fs.mkdirSync() synchroniczne. Można to poznać po dopisku Sync

Zmiana nazwy foldera

Metody mamy dwie fs.rename() lub fs.renemaSync().

const fs = require('fs')

// pierwszy parametr to obecna ścieżka do foldera
// drugi parametr to nowa nazwa foldera również ze ścieżką
fs.rename('/folder/test', '/folder/test1', err => {
  if (err) {
    console.error(err)
    return
  }
  //done
})

Wersja synchroniczna.

const fs = require('fs')

try {
  fs.renameSync('/folder/test', '/folder/test1')
} catch (err) {
  console.error(err)
}

Usuwanie foldera

Również dwie metody async jak i sync fs.rmdir() lub fs.rmdirSync()
Niestety z tymi metodami wiąże się jeden problem, a dokładnie dość skomplikowane jest usuwanie foldera z zawartością. Do tego najlepszym wyjściem jest zainstalowanie fs-extra lub rimraf Ja preferuję fs-extra, wystarczy zobaczyć ile metod posiada ta biblioteka [ node-fs-extra ]

Poniżej wykorzystanie tej biblioteki.

const fs = require('fs-extra')

const folder = '/folder/test'

fs.remove(folder, err => {
  console.error(err)
})

Lub wersja async/await

async function removeFolder(folder) {
  try {
    await fs.remove(folder)
    //done
  } catch (err) {
    console.error(err)
  }
}

const folder = '/folder/test'
removeFolder(folder)

Czytanie zawartości foldera

Oczywiście i tym razem mamy dwie wersje lub fs.readdirSync()

const fs = require('fs')
const path = require('path')

const folderPath = '/folder/test'

fs.readdirSync(folderPath)

Powyższy kod zwraca pliki i podfoldery ze ścieżką względną.

Możemy także filtrować wyniki by zwrócić pliki i wykluczyć foldery.

const isFile = fileName => {
  return fs.lstatSync(fileName).isFile()
}

fs.readdirSync(folderPath).map(fileName => {
  return path.join(folderPath, fileName)
})
.filter(isFile)

Użycie odpowiednich metod czasami jest uwzględnione od systemu operacyjnego. Jak to zwykle bywa windows w tym przypadku jest dość upośledzony i nie wszystkie metody działają tak jak należy lub wcale.
Trzeba cały czas posiłkować się dokumentacją.

Tutaj photoBlog jest przykład tworzenia sitemapy na potrzeby google. Jeszcze kilka miesięcy temu był to skrypt w napisany w perlu 😉
Stwierdziłem że jak już opieram się całkowicie o js to czemu nie użyć nodejs do generowania sitemapy. Użycie również jest proste jak i sam kod, wystarczy w konsoli wywołać - node ./sources/helpers/sitemap.js