Node.jsでreadlineモジュールを使ってディレクトリ内のすべてのディレクトリを取得する
Node.jsでディレクトリ内のすべてのディレクトリを取得する方法
fs.readdirSync()
は、指定されたディレクトリ内のファイル名とディレクトリ名のリストを取得する同期関数です。 以下のコードのように、readdirSync()
を使ってディレクトリ内のすべてのディレクトリを取得できます。
const fs = require('fs');
const dirPath = '/path/to/directory';
const files = fs.readdirSync(dirPath);
const directories = files.filter(file => fs.lstatSync(`${dirPath}/${file}`).isDirectory());
console.log(directories);
このコードは、まずfs
モジュールを読み込み、dirPath
変数に処理したいディレクトリのパスを設定します。
次に、readdirSync()
を使ってdirPath
内のファイル名とディレクトリ名のリストを取得します。
そして、filter()
メソッドを使って、リスト内のディレクトリのみを抽出します。
最後に、抽出結果をdirectories
変数に格納して、コンソールに出力します。
注意点
fs.readdirSync()
は同期関数なので、処理が完了するまで他の処理がブロックされます。- 大量のファイルやディレクトリが存在するディレクトリに対して使用すると、処理時間が長くなる可能性があります。
const fs = require('fs');
const dirPath = '/path/to/directory';
fs.readdir(dirPath, (err, files) => {
if (err) {
console.error(err);
return;
}
const directories = files.filter(file => fs.lstatSync(`${dirPath}/${file}`).isDirectory());
console.log(directories);
});
このコードは、fs.readdirSync()
を使ったコードとほぼ同じですが、readdir()
は非同期関数なので、処理完了後にコールバック関数が呼び出されます。
- コールバック関数内で処理を行う必要があるため、コードが複雑になりやすい。
fs.promises.readdir()を使う
Node.js v10以降では、fs.promises
モジュールを使って、Promiseベースでファイルシステムの操作を行うことができます。 以下のコードのように、fs.promises.readdir()
を使ってディレクトリ内のすべてのディレクトリを取得できます。
const fs = require('fs');
const dirPath = '/path/to/directory';
(async () => {
const files = await fs.promises.readdir(dirPath);
const directories = files.filter(file => (await fs.promises.lstat(`${dirPath}/${file}`)).isDirectory());
console.log(directories);
})();
このコードは、async
/await
構文を使って、Promiseベースで処理を行っています。
- Node.js v10以降でのみ使用可能。
サブディレクトリも再帰的に取得する
上記の方法は、ディレクトリ直下のディレクトリのみを取得します。 サブディレクトリも再帰的に取得するには、fs.readdir()
やfs.promises.readdir()
とfs.lstat()
を組み合わせて、以下のコードのように処理する必要があります。
const fs = require('fs');
const dirPath = '/path/to/directory';
async function getDirectories(dirPath) {
const files = await fs.promises.readdir(dirPath);
const directories = await Promise.all(files.map(async file => {
const stat = await fs.promises.lstat(`${dirPath}/${file}`);
if (stat.isDirectory()) {
return getDirectories(`${dirPath}/${file}`);
}
return [];
}));
return directories.flat();
}
(async () => {
const directories = await getDirectories(dirPath);
console.log(directories);
})();
このコードは、getDirectories()
という再帰関数を使って、サブディレクトリも再帰的に取得します。
Node.jsでディレクト
const fs = require('fs');
const dirPath = '/path/to/directory';
const files = fs.readdirSync(dirPath);
const directories = files.filter(file => fs.lstatSync(`${dirPath}/${file}`).isDirectory());
console.log(directories);
このコードを 실행するには、以下の手順が必要です。
- コードをファイルに保存します。
- ターミナルで以下のコマンドを実行します。
node <file-name>
file-name
は、コードを保存したファイル名に置き換えます。
実行結果は以下のようになります。
[
'/path/to/directory/subdirectory1',
'/path/to/directory/subdirectory2'
]
このコードは、dirPath
変数に設定されたディレクトリ内のすべてのディレクトリを取得し、コンソールに出力します。
fs.readdir()
を使ったサンプルコード
const fs = require('fs');
const dirPath = '/path/to/directory';
fs.readdir(dirPath, (err, files) => {
if (err) {
console.error(err);
return;
}
const directories = files.filter(file => fs.lstatSync(`${dirPath}/${file}`).isDirectory());
console.log(directories);
});
const fs = require('fs');
const dirPath = '/path/to/directory';
(async () => {
const files = await fs.promises.readdir(dirPath);
const directories = files.filter(file => (await fs.promises.lstat(`${dirPath}/${file}`)).isDirectory());
console.log(directories);
})();
- サブディレクトリも再帰的に取得するサンプルコード
const fs = require('fs');
const dirPath = '/path/to/directory';
async function getDirectories(dirPath) {
const files = await fs.promises.readdir(dirPath);
const directories = await Promise.all(files.map(async file => {
const stat = await fs.promises.lstat(`${dirPath}/${file}`);
if (stat.isDirectory()) {
return getDirectories(`${dirPath}/${file}`);
}
return [];
}));
return directories.flat();
}
(async () => {
const directories = await getDirectories(dirPath);
console.log(directories);
})();
これらのサンプルコードは、Node.jsでディレクトリ内のすべてのディレクトリを取得するさまざまな方法を示しています。
自分の目的に合った方法を選択して使用してください。
ディレクトリ内のすべてのディレクトリを取得するその他の方法
glob
モジュールは、ファイル名やディレクトリ名のワイルドカードパターンに基づいてファイルやディレクトリを検索するモジュールです。 以下のコードのように、glob
モジュールを使ってディレクトリ内のすべてのディレクトリを取得できます。
const glob = require('glob');
const dirPath = '/path/to/directory';
glob(`${dirPath}/**/*`, (err, files) => {
if (err) {
console.error(err);
return;
}
const directories = files.filter(file => fs.lstatSync(file).isDirectory());
console.log(directories);
});
このコードは、glob
モジュールのglob()
関数を使って、dirPath
変数に設定されたディレクトリ以下のすべてのファイルとディレクトリを検索します。
そして、検索結果からディレクトリのみを抽出します。
- ワイルドカードパターンを正しく理解する必要がある。
readline
モジュールは、ファイルや標準入力から行単位でデータを読み込むモジュールです。 以下のコードのように、readline
モジュールを使ってディレクトリ内のすべてのディレクトリを取得できます。
const readline = require('readline');
const dirPath = '/path/to/directory';
const rl = readline.createInterface({
input: fs.createReadStream(`${dirPath}/.`)
});
rl.on('line', (line) => {
if (fs.lstatSync(`${dirPath}/${line}`).isDirectory()) {
console.log(line);
}
});
- 処理速度が遅くなる可能性がある。
const walk = require('walk');
const dirPath = '/path/to/directory';
const walker = walk.walkSync(dirPath);
const directories = walker.filter(file => file.stats.isDirectory());
console.log(directories);
Node.jsでディレクトリ内のすべてのディレクトリを取得するには、いくつかの方法があります。
上記で紹介した方法はそれぞれメリットとデメリットがあるので、自分の目的に合った方法を選択してください。
node.js directory