Node jsで始めるfilesystem2

javascript

実際Nodeでフォルダーのファイルを一覧として取得してみます。Adobe CEPの環境でも動きます。ファイル関係のモジュールはfsになりますがfsやpathモジュールはデフォルトで使用できるモジュールなのでnpmでインストールやらなんやらする必要はありません。

コードの頭でモジュールを呼びだすのが良いみたいです。

実際に特定のフォルダーの中に入っているファイルを一覧として取得してみましょう。

今回デスクトップに設置したcopyFolderという名前のフォルダーからフォルダーの中身の一覧を取得します。実際copyFolderという名前のフォルダーをデスクトップに作成して中になんでもいいのでファイルを入れてみてください。実行すると中のファイルの一覧を取得できます。dir_desktop変数はデスクトップのパスを代入しています。process.envから取得しています。path.resolveはメソッドはパスを結合させます。今回引数に渡したdir_desktop変数のデスクトップパスと”copyTest”を結合させて~desktop/copyTestのようなパスを返します。これはdir_desktop+”/”+”copyTest”と同じ値になります。フォルダーの階層間には必ず”/”が入ります。resolveの他にもjoinという似たようなメソッドもありますがresolveは絶対パスを返すのに対してjoinは引数に渡した値を単に”/”でつなぐだけなようです。相対パスはscriptを動かしているフォルダーから見て相対的な場所を示します。例えばcopyTestの中にsrcフォルダーがあったとしてcopyTestの中に作成しscriptからsrcのディレクトリーを取得する場合はdir_desktop+”/”+”copyTest”+”/”+”src”と絶対的な位置を指定することも可能ですがcopyTestの中のフォルダーから見て相対的な位置にあるということで”./src”とdir_desktop+”/”+”copyTest”まで省略ができます。ちなみに相対パスの場合パスの冒頭に”./”をつける場合と付けなくても読み込む場合がありますが時々冒頭に”./”を付けないと動かないプログラムもあるので必ず付けた方がよでしょう。ちなみにjoinメソッドで単につないだ場合はこれがつかず、エラーの原因になる事もあるので注意。相対パスを書く場合は文字列を直接書いた方がいいかもしれない。

それではfs.readdirSyncメソッドでフォルダーの中のファイルを取得します。引数にフォルダーのメソッドを渡せばフォルダーの中の一覧が取得できます。今回copyTestフォルダーのファイルを取得するので

となります。取得したファイルの一覧はファイル名しか取得できていないので絶対パスを取得したい場合は引数に渡した変数を取得したファイルの名前の頭につけてやれば良いです。例えばcopyTestフォルダーの中にtest.jsというファイルがある場合はtest.jsというファイル名しかreaddirで取得できません。これの頭に引数に渡したcopyTestを結合してやればtest.jsの絶対パスになります。取得したファイルを全て絶対パスに変換する場合はmapメソッドで簡単にできます。

ファイル一覧は取得した後にファイルの情報を取得したり特定のアプリケーションで開いたりする事が多いと思うので絶対パスを使用する事が多々あると思います。

ちなみに今回readdirSyncという同期処理を使用しましたが通常Nodeでは多くのファイルを処理する必要があるのでreaddirという似たように名前のメソッドの非同期処理を使用するのが普通です。非同期処理ですと順番にファイルを一つ一つ処理してゆくのではなく、多くの処理を並行して進めてゆくことになります。これはどの処理がいつ終了するかわからないので非同期処理はコールバック等で待ち受け状態を作らないと上手く動きません。とりあえずコードの内容が難解になるとだけ考えてください。例えばreaddirを非同期で書くとこうなります。

getFiles関数でフォルダーのファイル一覧を取得して受け取ったコールバック関数をファイル取得後呼び出してcopyTestフォルダーパスをファイル名を取得と一気に難しくなりました。ですがよほど多くのファイルを処理するとか、実際にサーバー で動かすという訳でなければとりあえずは同期処理で簡単なコードを動かすだけで問題無いはずです。

Beer 寄付してサイトを応援する。