blog

NodeJsで空でないフォルダを削除する3つの方法

fsはfilesystemの略で、nodeに付属するI/Oモジュールで、ローカルファイルの読み書きに使われ、すべてのAPIが非同期と同期の両方で利用できます。ファイルを削除するメソッドはfs.rmdi...

Dec 20, 2017 · 4 min. read
シェア


fsはファイルシステムの略で、nodeに付属するI/Oモジュールで、ローカルファイルの読み書きに使われ、すべてのAPIが非同期型と同期型の両方で利用できます。ファイルを削除するメソッドはfs.rmdirで、その同期バージョンはfs.rmdirSyncですが、1つの問題は空のフォルダしか削除できず、空でないフォルダについては何もできないということです。ここでは、nodejsを使って空でないフォルダを削除する3つの方法を紹介します。

fsを使う - ファイルとフォルダの再帰的削除

このメソッドはまだシステム独自のfsモジュールを使用して、実装の原理は単純です。簡単にいうと、最初にフォルダ内のすべてのファイルを削除し、サブフォルダに遭遇した場合、サブフォルダに入り、すべての空のフォルダの最終的な削除まで、サブフォルダ内のすべてのファイルと空フォルダを削除します。

fsで使えるコマンドを見てみましょう:

  1. fs.stat && fs.statSyncは、ファイル属性情報へのアクセスを提供します。
  2. fs.unlink && unlinkSync は、フォルダ削除ではなく、ファイル削除の機能です。
  3. fs.rmdir && fs.rmdirSyncはフォルダを削除しますが、フォルダは空でなければなりません。

では、deleteの操作を実行してみます。deleteはそれぞれ2つのステップが必要です:

  • ステップ1:すべてのファイルと空のフォルダを削除します。
  • ステップ2:すべての空のフォルダを削除

コードの実装は次のとおりです:

"use strict"

const fs = require('fs')

const filePath = `${__dirname}/test`//削除するフォルダ url

//すべてのファイルを削除
function clearFolder(filePath) {
  const files = fs.readdirSync(filePath)//フォルダを読む
  files.forEach((file) => {
    const next = `${filePath}/${file}`
    const states = fs.statSync(next)
    if (states.isDirectory()) {
      emptyDir(next)
    } else {
      fs.unlinkSync(next)
      console.log(`ファイル ${next} の削除成功`)
    }
  })
}

//空のフォルダをすべて削除
function rmEmptyFolder(path) {
  const files = fs.readdirSync(path)
  if (files.length === 0) {
    fs.rmdirSync(ath)
    console.log(`空のフォルダ ${filePath} の削除成功`)
  } else {
    let count = 0;
    files.forEach((file) => {
      count++;
      rmEmptyFolder(`${path}/${file}`)
    })
    //親フォルダの下にある空のフォルダをすべて削除した後、親フォルダも削除してください。
    if(count === files.length) {
      fs.rmdirSync(path)
      console.log(`空のフォルダ ${path} の削除成功`)
    }
  }
}

コードの最適化:フォルダを空にして、フォルダを一度に削除します。

function rmFolder(path) {
  const files = []
  if (fs.existsSync(path)) {
    const files = fs.readdirSync(path)
    files.forEach((file) => {
      const next = `${path}/${file}`
      const states = fs.statSync(next)
      if (states.isDirectory()) {
        deleteFolder(next)
      } else {
        fs.unlinkSync(next)
      }
    })
    fs.rmdirSync(path)
  }
}

サブプロセスを使用 - "rm -rfコマンド "を実行します。

Node.jsはシングルスレッドモードで動作しますが、イベントドリブンを使用して並行処理を行うため、マルチコアCPUシステムで複数の子プロセスを作成してパフォーマンスを向上させることができます。

各子プロセスは常に3つのストリームオブジェクト、child.stdin、child.stdout、child.stderrを持ちます。これらは親のstdioストリームを共有することもできますし、チャンネル化された別々のストリームオブジェクトにすることもできます。

Node は子プロセスを作成するために child_process モジュールを提供しています:

  • exec - child_process.exec は子プロセスを使ってコマンドを実行し、子プロセスの出力をキャッシュし、子プロセスの出力をコールバック関数の引数として返します。
  • spawn - child_process.spawn は、指定されたコマンドライン引数で新しいプロセスを作成します。
  • fork - child_process.fork は spawn に相当します。spawn メソッドとは異なり、fork は親プロセスと子プロセスの間にプロセス間通信用の通信パイプを作成します。
const fs = require('fs')
const child_process = require('child_process');
const filePath = `${__dirname}/aaa`//削除するフォルダ url

const p = child_process.exec(`rm -rf ${filePath}`, 
    (error, stdout, stderr) => {
      if (error) {
          console.log(error)
      }
      console.log(stdout, stderr)
    })

p.on('exit', function (code) {
  console.log('子プロセスが終了しました。 '+code);
})

サードパーティツールキットrimrafの使用

最も簡単な方法は、サードパーティツールキット rimraf をインストールすることです。 rimraf パッケージの機能: rm -rf コマンドをパッケージの形でラップし、フォルダが空かどうかに関係なくファイルやフォルダを削除するために使用します。

  1. npm: https://www.npmjs.com/package/rimraf
  2. GitHub:rimraf

このパッケージが提供するのは、ファイルやフォルダの削除という1つの方法だけです:

const obj = require('rimraf');
obj('./test', function (c) {
    if (c)
        console.log(c);
});
Read next

No articles found.

No articles found.