Node.js fs モジュール
fs (File System) モジュールは Node.js に組み込まれたコアモジュールで、ファイルシステムと対話するために使用されます。
fs モジュールは、ファイルの読み取り、書き込み、削除などの操作を処理する一連のメソッドを提供します。
fs モジュールは Node.js 開発で最もよく使われるモジュールの一つで、特にローカルファイルを扱う場面で使用されます。
fs モジュールの使い方?
fs モジュールを使用するには、まずインポートする必要があります:
const fs = require('fs');
Node.js 14 以降では、ES6 の import 構文も使用できます:
例
const fs = require('fs'); // CommonJS 方式
// または
import fs from 'fs'; // ES Module 方式
// または
import fs from 'fs'; // ES Module 方式
fs モジュールの主なメソッド
1. ファイル読み込み
ファイルの同期読み込み (readFileSync)
例
const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
console.log(data);
'example.txt':読み込むファイルのパス'utf8':エンコーディング形式を指定(省略可)- 同期メソッドはファイルの読み込みが完了するまでコードの実行をブロックします
ファイルの非同期読み込み (readFile)
例
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
if (err) throw err;
console.log(data);
});
- 非同期メソッドはコードの実行をブロックしません
- コールバック関数で結果を処理します
- エラーファーストコールバック(err-first callback)は Node.js の一般的なパターンです
2. ファイル書き込み
ファイルの同期書き込み (writeFileSync)
例
fs.writeFileSync('output.txt', 'Hello, Node.js!');
ファイルの非同期書き込み (writeFile)
例
fs.writeFile('output.txt', 'Hello, Node.js!', (err) => {
if (err) throw err;
console.log('ファイルが保存されました');
});
if (err) throw err;
console.log('ファイルが保存されました');
});
3. ファイル追加
ファイルの同期追加 (appendFileSync)
例
fs.appendFileSync('log.txt', '新しいログ内容\n');
ファイルの非同期追加 (appendFile)
例
fs.appendFile('log.txt', '新しいログ内容\n', (err) => {
if (err) throw err;
});
if (err) throw err;
});
4. ファイル状態の確認 (stat)
例
fs.stat('example.txt', (err, stats) => {
if (err) throw err;
console.log(`ファイルサイズ: ${stats.size} bytes`);
console.log(`作成時間: ${stats.birthtime}`);
console.log(`ファイルかどうか: ${stats.isFile()}`);
console.log(`ディレクトリかどうか: ${stats.isDirectory()}`);
});
if (err) throw err;
console.log(`ファイルサイズ: ${stats.size} bytes`);
console.log(`作成時間: ${stats.birthtime}`);
console.log(`ファイルかどうか: ${stats.isFile()}`);
console.log(`ディレクトリかどうか: ${stats.isDirectory()}`);
});
5. ファイル削除
ファイルの同期削除 (unlinkSync)
例
fs.unlinkSync('fileToDelete.txt');
ファイルの非同期削除 (unlink)
例
fs.unlink('fileToDelete.txt', (err) => {
if (err) throw err;
console.log('ファイルが削除されました');
});
if (err) throw err;
console.log('ファイルが削除されました');
});
Promise と async/await のサポート
Node.js 10+ は fs/promises モジュールを提供し、Promise スタイルの API をサポートしています:
例
const fs = require('fs').promises;
async function readFile() {
try {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error('ファイル読み込みエラー:', err);
}
}
readFile();
async function readFile() {
try {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error('ファイル読み込みエラー:', err);
}
}
readFile();
ストリームファイル操作
大きなファイルには、ストリーム(Stream)を使用するとパフォーマンスを向上できます:
読み取りストリーム
例
const readStream = fs.createReadStream('largeFile.txt', 'utf8');
readStream.on('data', (chunk) => {
console.log('データを受信:', chunk.length);
});
readStream.on('end', () => {
console.log('読み取り完了');
});
readStream.on('error', (err) => {
console.error('読み取りエラー:', err);
});
readStream.on('data', (chunk) => {
console.log('データを受信:', chunk.length);
});
readStream.on('end', () => {
console.log('読み取り完了');
});
readStream.on('error', (err) => {
console.error('読み取りエラー:', err);
});
書き込みストリーム
例
const writeStream = fs.createWriteStream('output.txt');
writeStream.write('1行目のデータ\n');
writeStream.write('2行目のデータ\n');
writeStream.end('最終行のデータ');
writeStream.on('finish', () => {
console.log('書き込み完了');
});
writeStream.on('error', (err) => {
console.error('書き込みエラー:', err);
});
writeStream.write('1行目のデータ\n');
writeStream.write('2行目のデータ\n');
writeStream.end('最終行のデータ');
writeStream.on('finish', () => {
console.log('書き込み完了');
});
writeStream.on('error', (err) => {
console.error('書き込みエラー:', err);
});
ディレクトリ操作
ディレクトリの作成
例
fs.mkdir('newFolder', (err) => {
if (err) throw err;
console.log('ディレクトリが作成されました');
});
if (err) throw err;
console.log('ディレクトリが作成されました');
});
ディレクトリ内容の読み取り
例
fs.readdir('./', (err, files) => {
if (err) throw err;
console.log('現在のディレクトリ内容:', files);
});
if (err) throw err;
console.log('現在のディレクトリ内容:', files);
});
ディレクトリの削除
例
fs.rmdir('emptyFolder', (err) => {
if (err) throw err;
console.log('ディレクトリが削除されました');
});
if (err) throw err;
console.log('ディレクトリが削除されました');
});
ベストプラクティス
- 非同期メソッドを優先して使用する:イベントループのブロックを避ける
- エラー処理:起こり得るエラーを常に処理する
- ストリームを使用して大きなファイルを処理する:パフォーマンスを向上する
- パス処理:path モジュールを使用してクロスプラットフォームのパス問題を処理する
- 権限チェック:操作前にファイル/ディレクトリの権限を確認する
実践的な応用例
ファイルコピー機能
例
const fs = require('fs');
function copyFile(source, target, cb) {
const readStream = fs.createReadStream(source);
const writeStream = fs.createWriteStream(target);
readStream.on('error', cb);
writeStream.on('error', cb);
readStream.on('close', () => {
writeStream.end();
cb(null);
});
readStream.pipe(writeStream);
}
copyFile('source.txt', 'target.txt', (err) => {
if (err) return console.error('コピー失敗:', err);
console.log('ファイルのコピーが成功しました');
});
function copyFile(source, target, cb) {
const readStream = fs.createReadStream(source);
const writeStream = fs.createWriteStream(target);
readStream.on('error', cb);
writeStream.on('error', cb);
readStream.on('close', () => {
writeStream.end();
cb(null);
});
readStream.pipe(writeStream);
}
copyFile('source.txt', 'target.txt', (err) => {
if (err) return console.error('コピー失敗:', err);
console.log('ファイルのコピーが成功しました');
});
その他の拡張
Node.js 組み込みモジュール