Node.js でディレクトリ内のすべてのファイルを読み込み、オブジェクトに格納して送信する方法
必要なもの
以下のものが必要です。
- Node.js 環境
- テキストエディタ
手順
-
プロジェクトを作成する
まず、新しい Node.jsプロジェクトを作成します。ターミナルを開き、プロジェクトを作成したいディレクトリに移動し、以下のコマンドを実行します。
npm init -y
上記のコマンドで、
package.json
ファイルが作成されます。 -
必要なモジュールをインストールする
以下のコマンドを実行して、必要なモジュールをインストールします。
npm install fs
このコマンドで、
fs
モジュールがインストールされます。このモジュールは、ファイルシステム操作に使用します。 -
スクリプトを作成する
テキストエディタで、以下のスクリプトを作成します。
const fs = require('fs'); const directoryPath = './dir'; // 読み込むディレクトリのパス const readFiles = async () => { const files = await fs.readdirSync(directoryPath); // ディレクトリ内のファイル一覧を取得 const objects = []; for (const fileName of files) { const filePath = path.join(directoryPath, fileName); // ファイルパスを作成 const fileContent = await fs.readFileSync(filePath, 'utf8'); // ファイルの内容を読み込む const object = { fileName, // ファイル名 content: fileContent // ファイル内容 }; objects.push(object); // オブジェクトを配列に追加 } return objects; }; (async () => { const objects = await readFiles(); console.log(objects); // オブジェクトをコンソールに出力 })();
このスクリプトは、以下の処理を行います。
fs
モジュールをインポートします。- 読み込むディレクトリのパスを
directoryPath
変数に格納します。 readFiles
関数を作成します。
- この関数は、非同期的に実行されます。
fs.readdirSync
関数を使用して、ディレクトリ内のファイル一覧を取得します。- 各ファイルに対して、以下の処理を行います。
path.join
関数を使用して、ファイルパスを作成します。fs.readFileSync
関数を使用して、ファイルの内容を読み込みます。- ファイル名とファイル内容を格納したオブジェクトを作成します。
- オブジェクトを
objects
配列に追加します。
objects
配列を返します。
(async () => {...})();
構文を使用して、非同期処理を実行します。readFiles
関数を呼び出して、オブジェクトを取得します。- 取得したオブジェクトをコンソールに出力します。
-
以下のコマンドを実行して、スクリプトを実行します。
node index.js
上記のコマンドを実行すると、ディレクトリ内のすべてのファイルの内容が、オブジェクト配列としてコンソールに出力されます。
- ファイルの内容を文字列ではなく、バイナリデータとして読み込みたい場合は、
fs.readFileSync
関数の代わりにfs.readFile
関数を使用することができます。 - 特定の拡張子のファイルのみを読み込みたい場合は、
fs.readdirSync
関数の結果をfilter
関数を使用してフィルタリングすることができます。
応用例
この方法は、以下のような場合に役立ちます。
- ファイルの内容をデータベースに保存したい場合
- ファイルをAPI経由で送信したい場合
const fs = require('fs');
const directoryPath = './dir'; // 読み込むディレクトリのパス
const readFiles = async () => {
const files = await fs.readdirSync(directoryPath); // ディレクトリ内のファイル一覧を取得
const objects = [];
for (const fileName of files) {
const filePath = path.join(directoryPath, fileName); // ファイルパスを作成
const fileContent = await fs.readFileSync(filePath, 'utf8'); // ファイルの内容を読み込む
const object = {
fileName, // ファイル名
content: fileContent // ファイル内容
};
objects.push(object); // オブジェクトを配列に追加
}
return objects;
};
(async () => {
const objects = await readFiles();
console.log(objects); // オブジェクトをコンソールに出力
})();
モジュールのインポート
ディレクトリパスの設定
directoryPath
変数に、読み込むディレクトリのパスを設定します。
readFiles 関数の作成
readFiles
関数は、非同期的に実行される関数です。この関数は、以下の処理を行います。
非同期処理の実行
オブジェクトの取得と出力
readFiles
関数を呼び出して、オブジェクトを取得します。取得したオブジェクトをコンソールに出力します。
- このコードは、Node.js 16.14.0 で動作確認しています。
glob モジュールを使用する
glob
モジュールを使用すると、ワイルドカードを使用してファイルを指定することができます。この方法は、特定の拡張子のファイルのみを読み込みたい場合などに便利です。
const glob = require('glob');
const fs = require('fs');
const directoryPath = './dir'; // 読み込むディレクトリのパス
const pattern = '*.txt'; // 読み込むファイルの拡張子
const readFiles = async () => {
const files = await glob(pattern, { cwd: directoryPath }); // ファイル一覧を取得
const objects = [];
for (const filePath of files) {
const fileContent = await fs.readFileSync(filePath, 'utf8'); // ファイルの内容を読み込む
const object = {
fileName: path.basename(filePath), // ファイル名
content: fileContent // ファイル内容
};
objects.push(object); // オブジェクトを配列に追加
}
return objects;
};
(async () => {
const objects = await readFiles();
console.log(objects); // オブジェクトをコンソールに出力
})();
このコードは以下の通りです。
最初の 2 行で、glob
モジュールと fs
モジュールをインポートします。
directoryPath
変数に、読み込むディレクトリのパスを設定します。pattern
変数に、読み込むファイルの拡張子を設定します。
glob
関数を使用して、pattern
に一致するファイル一覧を取得します。
readline モジュールを使用する
readline
モジュールを使用すると、ファイルの内容を一行ずつ読み込むことができます。この方法は、大きなファイルを処理する場合などに便利です。
const fs = require('fs');
const readline = require('readline');
const directoryPath = './dir'; // 読み込むディレクトリのパス
const readFiles = async () => {
const objects = [];
for (const fileName of await fs.readdirSync(directoryPath)) {
const filePath = path.join(directoryPath, fileName);
const fileContent = [];
const rl = readline.createInterface({
input: fs.createReadStream(filePath),
crlfDelay: Infinity
});
rl.on('line', (line) => {
fileContent.push(line);
});
await new Promise((resolve) => {
rl.on('close', resolve);
});
objects.push({
fileName,
content: fileContent.join('\n') // ファイル内容を改行で結合
});
}
return objects;
};
(async () => {
const objects = await readFiles();
console.log(objects); // オブジェクトをコンソールに出力
})();
node.js