NTTドコモ様_dカーシェア
NTTドコモ様_dカーシェア
2014.12.18

Node.js完全初心者が、ディレクトリを非同期で読み取り、ファイルをコンソールに出力する方法

エリカ

こんにちは。ディレクターのエリカです。

こちらは、Node.jsという言葉を聞いて「何となくはわかるけど、実際にどんなものか触ったことがない」という初心者の方に向け、チュートリアル用モジュール「learnyounode」でエクササイズをしていくコーナーの第5回目です。

前回は、ファイルを非同期で読み取り、行数を出力する問題について紹介しましたが、今回はディレクトリを非同期で読み取り、ファイルをコンソールに出力する方法をご紹介します。

Node.jsを勉強したいと思っている人のキッカケや第一歩になれば幸いです。それでは早速はじめていきましょう。

FILTERED LS(Exercise 5 of 13)

「learnyounode」のインストールがまだの方は、こちらからどうぞ。

問題

あるディレクトリの中にあるファイルを、拡張子でフィルタリングして表示するプログラムを作成してください。
コマンド実行時には、ディレクトリへのパスが第一引数に、フィルタする拡張子が第二引数に与えられるものとします。

例えば、第二引数に「txt」が与えられた場合には、「.txt」で終わるファイルのみを表示する必要があります。

ファイルのリストは、ファイル名を一行毎に表示する形式にしてください。また、今回は非同期で処理をおこなってください。

ヒント

fs.readdir()というメソッドが、第一引数にパスを、第二引数にコールバックをとります。

fs.readdir(path, callback)
非同期で行われるディレクトリ読み込みです。コールバックにはerrとfilesの二つの引数を与えます。filesには、対象ディレクトリの「.」と「..」を除くファイルが配列で格納されています。

また、pathモジュールのextnameメソッドが便利かもしれません。

path.extname(p)

解答

var fs = require('fs') // fsモジュールを利用できるように
    var path = require('path') // pathモジュールを利用できるように

    // process.argv[2]には対象のディレクトリのパスが格納されています。
    fs.readdir(process.argv[2], function (err, list) {
      list.forEach(function (file) {
        // process.argv[3]にはフィルタする拡張子が格納されています。
        if (path.extname(file) === '.' + process.argv[3])
          console.log(file)
      })
    })

まとめ

いかがでしたでしょうか。
これだけでも、応用すればいろいろと便利なものが作れそうな気がしませんか?
Node.jsはWebサイトを作るだけのものではないのです。いろいろな作業を便利にできるんですね。
fsモジュールやpathモジュールもそうですが、次回は、そのモジュールを作ります。

「learnyounode」エクササイズシリーズ

  1. Node.js完全初心者向けチュートリアル用モジュール「learnyounode」を使ってみよう
  2. Node.js完全初心者のための、合計値を計算し、コンソールに出力する方法
  3. Node.js完全初心者が、ファイルを同期で読み取り、行数をコンソールに出力する方法
  4. Node.js完全初心者が、ファイルを非同期で読み取り、行数をコンソールに出力する方法