Node.jsでサーバーサイドのアプリケーションを開発する際、ログファイルの保存先やユーザーのアップロード用フォルダなど、動的にディレクトリを作成する場面は非常に多く存在します。
Node.jsの標準モジュールである fs (File System) モジュールを使用すれば、OSの種類を問わず簡単にフォルダを作成することが可能です。
本記事では、Node.jsでフォルダを作成するための主要な手段である fs.mkdir と fs.mkdirSync、さらにモダンな fs.promises について詳しく解説します。
それぞれのメソッドの特徴や使い分けの基準、エラーハンドリングの方法を理解することで、より堅牢なプログラムを記述できるようになります。
Node.jsにおけるファイル操作の基本
Node.jsでフォルダやファイルを操作するためには、標準で提供されている fs モジュールを使用します。
このモジュールには、「非同期処理」と「同期処理」の2種類のメソッドが用意されています。
非同期処理はプログラムの実行を止めずにバックグラウンドで処理を行い、同期処理は処理が完了するまで次のコードを実行しません。
近年のNode.js開発では、Promiseベースの非同期処理を利用することが一般的になっています。
開発の要件に合わせて、これらの手法を適切に選択することが重要です。
非同期でフォルダを作成する:fs.mkdir
fs.mkdir は、非同期でフォルダを作成するための最も基本的なメソッドです。
このメソッドは処理が完了した際に実行される「コールバック関数」を引数に取ります。
以下のサンプルコードは、カレントディレクトリに 「new-directory」 という名前のフォルダを作成する例です。
const fs = require('fs');
// フォルダ作成の実行
fs.mkdir('new-directory', (err) => {
if (err) {
// エラーが発生した場合の処理
return console.error('フォルダの作成に失敗しました:', err);
}
console.log('フォルダが正常に作成されました');
});
フォルダが正常に作成されました
非同期メソッドを使用する最大のメリットは、メインスレッドをブロックしないことです。
大量のリクエストを処理するWebサーバーなどでは、ファイル操作中に他の処理が止まることを防ぐために非同期処理が推奨されます。
同期処理でフォルダを作成する:fs.mkdirSync
fs.mkdirSync は、フォルダの作成が完了するまでプログラムの進行を停止させる同期メソッドです。
スクリプトの実行開始時に必要なディレクトリを確実に作成したい場合などに便利です。
同期処理はエラーが発生した際に例外をスローするため、 try...catch 構文でエラーを捕捉する必要があります。
const fs = require('fs');
try {
// 同期的にフォルダを作成
fs.mkdirSync('sync-directory');
console.log('同期処理でフォルダが作成されました');
} catch (err) {
// すでに存在する場合などのエラー処理
console.error('エラーが発生しました:', err.message);
}
同期処理でフォルダが作成されました
同期メソッドはコードが直感的に書ける一方で、大規模なアプリケーションではパフォーマンス低下の原因になる可能性があるため注意が必要です。
基本的には、CLIツールや初期化フェーズなどの限定的な場面で使用するのが望ましいでしょう。
再帰的なフォルダ作成 (recursiveオプション)
深い階層のディレクトリを一度に作成したい場合、 recursive: true というオプションを使用します。
これを使用しない場合、親ディレクトリが存在しない状態で子ディレクトリを作成しようとするとエラーが発生します。
例えば、 「logs/2026/01」 のように多階層のフォルダを一度に作りたい時に非常に重宝します。
const fs = require('fs');
// recursiveオプションを有効にして多階層フォルダを作成
fs.mkdir('logs/2026/01', { recursive: true }, (err) => {
if (err) throw err;
console.log('多階層のフォルダが作成されました');
});
このオプションを使用すると、指定したパスの途中のディレクトリが存在しなくても自動で作成してくれます。
また、すでにディレクトリが存在していてもエラーにならないという便利な特性を持っています。
モダンな記述:fs.promises.mkdir
Node.js 10以降では、Promiseをベースとした fs.promises APIが導入されました。
これにより、 async/await 構文を用いて非同期処理を同期処理のようにスッキリと記述できます。
現在のNode.js開発においては、この書き方が最も推奨されるスタイルです。
const fs = require('fs').promises;
async function createFolder() {
try {
await fs.mkdir('modern-directory', { recursive: true });
console.log('Promiseベースでフォルダを作成しました');
} catch (err) {
console.error('エラー:', err);
}
}
createFolder();
コールバック地獄を避けることができ、可読性が格段に向上します。
大規模なプロジェクトでは、メンテナンス性の観点から fs.promises の利用を検討してください。
mkdir と mkdirSync の使い分け
どちらのメソッドを使うべきか迷った際は、以下の基準を参考にしてください。
| メソッド名 | 処理タイプ | 主な利用シーン | メリット |
|---|---|---|---|
| fs.mkdir | 非同期 | Webサーバーの実行中など | アプリの動作を止めない |
| fs.mkdirSync | 同期 | アプリ起動時の初期設定など | コードがシンプルで順序が保証される |
| fs.promises.mkdir | Promise (非同期) | モダンなアプリケーション全般 | async/awaitが使えて可読性が高い |
基本的には fs.promises.mkdir を第一選択とし、環境や制約に応じて他のメソッドを検討するのが良いでしょう。
注意点とエラーハンドリング
フォルダ作成時に最も多いエラーは、「既に同名のフォルダが存在する」というケースです。
recursive: true を指定していない場合、既存のフォルダ名を指定すると EEXIST というエラーコードが返されます。
事前に fs.existsSync() を使ってチェックするか、 try...catch で適切に処理を分岐させる必要があります。
また、書き込み権限がないディレクトリにフォルダを作ろうとすると EACCES エラーが発生します。
プログラムを実行するユーザーが適切なパーミッションを持っているか、実行環境の設定を確認しましょう。
まとめ
Node.jsでフォルダを作成する方法には、 fs.mkdir 、 fs.mkdirSync 、そして fs.promises.mkdir の3種類があります。
パフォーマンスを重視するWebアプリケーションでは非同期処理を、単純な自動化スクリプトでは同期処理を選択するのが一般的です。
多階層のフォルダを作成する際には、 recursive: true オプションを活用することでコードを簡略化できます。
現代的な開発スタイルでは、 async/await が利用可能な fs.promises APIを使うのが最適です。
この記事で紹介した手法を使い分け、状況に応じた最適なディレクトリ操作を実装してください。
