learnyounode [ FILTERED LS]
拡張子によってフィルタしたファイルリストをコンソールに出力するアプリを書いてください。
5問目は、指定した拡張子のファイルを列挙するアプリです。シェルコマンドで言えば「find -name ".拡張子"」の様な結果になるということですね。
1つめの引数にフォルダのパスを入れ、2つめの引数に拡張子を指定します。2つめの拡張子は拡張子名のみ、("."抜き)で指定とあります。
とりあえず、ファイルの列挙から始めましょう。
fs.readdir
readdir.js
var fs = require("fs"); var dir = "."; fs.readdir(dir, function(err, list) { if(err) throw err; for(var i in list) { console.log(list[i]); } });
if (err) throw err; もエラーをthrowさせるNodeのイディオムなので無くても正常であれば動作します。
forは得られた配列を展開しているだけなので、イテレータ「files.forEach(function (file) { }」でもいけます。
得られたファイルリストから拡張子を抜き出すには、文字列操作を使っても構いませんがヒントに拡張子を抜き出すNodeのpathモジュールを使うと役に立つと書いてあるのでpathモジュールのextname関数を使用します。extname関数は引数にファイルを入れると拡張子だけ抜き出してくれます。それを判定に使えばいけますね。
path.extname
気をつけることは引数には拡張子名だけ指定してextnameで抜き出せる拡張子が"."付きだということです。なので"."を足してから比較します。
あとは引数と得るのは先回使ったprocess.argv[N]なので組み合わせて完了です。
extname.js
extname.js
var fs = require("fs"); var path = require("path"); var dir = process.argv[2]; var ext = process.argv[3]; fs.readdir(dir, function(err, list) { if(err) throw err; for(var i in list) { if(path.extname(list[i]) == '.' + ext) { console.log(list[i]); } } });
$ learnyounode verify extname.js ................... # おめでとう! 「LSのフィルター」に対するあなたの回答は合格です! これが正式な回答です(もしあなたの回答と比較してみたいならどうぞ): ───────────────────────────────────────── var fs = require('fs') var path = require('path') fs.readdir(process.argv[2], function (err, list) { list.forEach(function (file) { if (path.extname(file) === '.' + process.argv[3]) console.log(file) }) })
0 件のコメント:
コメントを投稿