情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでフォルダの直下にあるファイルやフォルダのリストを取得する

2016/03/24

フォルダの直下にあるファイルやフォルダのリストを取得するには非同期的に取得する方法と同期的に取得する方法の2つがあります。


非同期的に取得するにはfs.readdir関数を使用します。

第1引数にフォルダのパスを指定します。

第2引数にコールバック関数を指定します。この関数の第1引数はエラーオブジェクトです。そして、第2引数がフォルダの直下にあるファイルやフォルダのリストです。ファイルを示すパスや存在しないパスを指定した場合にはエラーが発生します。


同期的に取得するにはfs.readdirSync関数を使用します。

第1引数にフォルダのパスを指定します。

返り値としてフォルダの直下にあるファイルやフォルダのリストが得られます。ファイルを示すパスや存在しないパスを指定した場合にはエラーが発生します。


なお、原則的にはfs.readdir関数を使用するべきであり、特に理由がないならfs.readdirSync関数は使用するべきではありません。

これは、ファイルへのアクセスは非常に時間の掛かる処理であるためです。ファイルへのアクセスを同期的に行うと、アクセスが完了するまでプログラムは待機状態となり、他の処理を行うことができません。長い時間プログラムが待機状態になると、様々な問題を引き起こす可能性があります。

サンプルコード1

fs.readdir関数の使用例です。

コマンドライン引数として与えられたフォルダの直下にあるファイルやフォルダのリストを非同期的に取得し、標準出力に出力します。

fs-readdir.js

var fs = require('fs');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

fs.readdir(process.argv[2], function (err, list) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        for (var i = 0; i < list.length; i++) {
            console.log(list[i]);
        }
    }
});

実行結果

ファイルを示すパスや存在しないパスC:\worksを指定した場合にはエラーとなっていることが分かります。

C:\work\node>node fs-readdir.js C:\work\node
console-color.js
console-error.js
console-log.js
console-time.js
fs-creaters.js
fs-readdir-ext.js
fs-readdir-file.js
fs-readdir-folder.js
fs-readdir.js
fs-readfile.js
fs-stat-directory.js
fs-stat-file.js
fs-writefile.js
node_modules
path-basename.js
path-dirname.js
path-extname.js
path-join.js
process-argv.js
process-exit.js
read-text-file.js
textfile.txt
util-format.js
util-log.js
write-text-file.js

C:\work\node>node fs-readdir.js C:\work\node\fs-readdir.js
{ [Error: ENOTDIR: not a directory, scandir 'C:\work\node\fs-readdir.js']
  errno: -4052,
  code: 'ENOTDIR',
  syscall: 'scandir',
  path: 'C:\\work\\node\\fs-readdir.js' }

C:\work\node>node fs-readdir.js C:\works
{ [Error: ENOENT: no such file or directory, scandir 'C:\works']
  errno: -4058,
  code: 'ENOENT',
  syscall: 'scandir',
  path: 'C:\\works' }

サンプルコード2

fs.readdirSync関数の使用例です。

コマンドライン引数として与えられたフォルダの直下にあるファイルやフォルダのリストを同期的に取得し、標準出力に出力します。

fs-readdirsync.js

var fs = require('fs');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

try {
    var list = fs.readdirSync(process.argv[2]);
    for (var i = 0; i < list.length; i++) {
        console.log(list[i]);
    }
}
catch (err) {
    console.error(err);
    process.exit(1);
}

実行結果

ファイルを示すパスや存在しないパスC:\worksを指定した場合にはエラーとなっていることが分かります。

C:\work\node>node fs-readdirsync.js C:\work\node
console-dir.js
ejs
ejstest
fs-readdirsync.js
fs-statsync-directory.js
fs-statsync-file.js
http-get-text.js
irori
node_modules
old
templateengine
test.htm
util-inspect-console-dir.js
_

C:\work\node>node fs-readdirsync.js C:\work\node\fs-readdirsync.js
{ [Error: ENOTDIR: not a directory, scandir 'C:\work\node\fs-readdirsync.js']
  errno: -4052,
  code: 'ENOTDIR',
  syscall: 'scandir',
  path: 'C:\\work\\node\\fs-readdirsync.js' }

C:\work\node>node fs-readdirsync.js C:\works
{ [Error: ENOENT: no such file or directory, scandir 'C:\works']
  errno: -4058,
  code: 'ENOENT',
  syscall: 'scandir',
  path: 'C:\\works' }

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js