Node.js - ファイルシステム

こんにちは、未来のプログラマーたち!今日は、Node.jsとそのファイルシステムモジュールの面白い世界に飛び込みます。あなたの近所の親切なコンピュータ教師として、私は多くの例と説明を交えてこの旅を案内します。那么、シートベルトを締めて、始めましょう!

Node.js - File System

同期と非同期

ファイル操作の詳細に入る前に、重要な概念2つについて話しましょう:同期と非同期操作。

考え کنید、カフェ숍にいるとします。同期の世界では、コーヒーを注文し、それが作られるのを待ってから次のタスクに進みます。非同期の世界では、コーヒーを注文した後、バリスタが準備する間に他の işをします。

Node.jsでは、ファイル操作に同期と非同期の両方のメソッドがあります。以下に例を示します:

const fs = require('fs');

// 同期読み取り
const data = fs.readFileSync('hello.txt', 'utf8');
console.log(data);

// 非同期読み取り
fs.readFile('hello.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});

同期バージョンでは、プログラムはファイルを読み取るまで待ちます。非同期バージョンでは、ファイルを読み取る間に他の命令を実行し、読み取りが完了したらコールバック関数を実行します。

ファイルの書き込み

さあ、ファイルに書き込む方法を学びましょう。未来の自分へのメモを残すようなものです!

const fs = require('fs');

// 同期書き込み
fs.writeFileSync('note.txt', 'こんにちは、未来の自分!');

// 非同期書き込み
fs.writeFile('note.txt', 'こんにちは、未来の自分!', (err) => {
if (err) throw err;
console.log('ファイルが保存されました!');
});

どちらの場合も、'note.txt'というファイルを作成(または上書き)し、「こんにちは、未来の自分!」という内容を書き込みます。非同期バージョンには、ファイルが書き込まれた後に実行されるコールバック関数が含まれています。

ファイルの読み取り

ファイルを読むのは、自分に残したメモを開くようなものです。やり方を見てみましょう:

const fs = require('fs');

// 同期読み取り
const data = fs.readFileSync('note.txt', 'utf8');
console.log(data);

// 非同期読み取り
fs.readFile('note.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});

どちらのメソッドも、'note.txt'の内容を出力します。'utf8'パラメータはファイルのエンコーディングを指定します。

ファイルを開く

時々、ファイルとのやりとりをより細かくコントロールしたいことがあります。それには、openメソッドが役立ちます:

const fs = require('fs');

// 非同期開く
fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
console.log('ファイルが正常に開かれました!');
// 終了したらファイルを閉じることを忘れずに
fs.close(fd, (err) => {
if (err) throw err;
});
});

これは、'myfile.txt'を読み取りモード('r')で開きます。コールバックのfdはファイルデSCRIPTORで、ファイル操作を行うために使用されます。

プロミスAPI

プロミス(Promise)を使いたい人向けに、Node.jsはファイル操作のためのプロミスベースのAPIを提供しています:

const fs = require('fs').promises;

async function readMyFile() {
try {
const data = await fs.readFile('myfile.txt', 'utf8');
console.log(data);
} catch (error) {
console.error('ファイル読み取り中にエラー発生:', error);
}
}

readMyFile();

これは、前の非同期readFileの例と同じ結果を得ますが、モダンなJavaScriptの構文を使用しています。

ファイル情報の取得

ファイルの統計情報に興味がありますか?Node.jsはそれをサポートしています:

const fs = require('fs');

fs.stat('myfile.txt', (err, stats) => {
if (err) throw err;
console.log(`ファイルサイズ: ${stats.size}バイト`);
console.log(`ディレクトリですか? ${stats.isDirectory()}`);
console.log(`ファイルですか? ${stats.isFile()}`);
});

これにより、ファイルサイズや、それがディレクトリであるかファイルであるかなどの情報を取得できます。

ファイルの閉じる

ファイルの操作が終了したら、常にファイルを閉じることを忘れないでください。これは、トゥースパasteのキャップをしめるようなものです!

const fs = require('fs');

fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
// 何か操作を行う...
fs.close(fd, (err) => {
if (err) throw err;
console.log('ファイルが正常に閉じられました');
});
});

ファイルの切り詰める

ファイルを保持したいが、その内容を削除したい場合があります。その場合、切り詰める(truncate)メソッドが役立ちます:

const fs = require('fs');

fs.truncate('myfile.txt', 0, (err) => {
if (err) throw err;
console.log('ファイルの内容がクリアされました!');
});

これはファイルを0バイトに減らし、効果的に内容をクリアします。

ファイルの削除

ファイルが完全に不要になった場合、削除することができます:

const fs = require('fs');

fs.unlink('myfile.txt', (err) => {
if (err) throw err;
console.log('ファイルが正常に削除されました');
});

この操作には注意してください。現実の世界には undo ボタンはありません!

ディレクトリの作成

新しいフォルダが必要ですか?以下に方法を示します:

const fs = require('fs');

fs.mkdir('mynewfolder', (err) => {
if (err) throw err;
console.log('ディレクトリが正常に作成されました!');
});

ディレクトリの読み取り

ディレクトリの中身を見たい場合は以下のようにします:

const fs = require('fs');

fs.readdir('.', (err, files) => {
if (err) throw err;
console.log('ディレクトリの内容:');
files.forEach(file => {
console.log(file);
});
});

これは、現在のディレクトリ内のすべてのファイルとサブディレクトリをリストアップします。

ディレクトリの削除

ディレクトリを削除したい場合は以下のようにします:

const fs = require('fs');

fs.rmdir('mynewfolder', (err) => {
if (err) throw err;
console.log('ディレクトリが正常に削除されました');
});

これは、空のディレクトリのみを削除できます。

メソッドのリファレンス

ここに、私たちがカバーしたメソッドの便利なテーブルを示します:

メソッド 説明
readFile ファイルの全部を読み取る
writeFile データをファイルに書き込み、既存のファイルを上書きする
open ファイルを読み取りまたは書き込みのために開く
close ファイルデSCRIPTORを閉じる
stat ファイルの情報を取得する
truncate ファイルを指定された長さに切り詰める
unlink ファイルを削除する
mkdir 新しいディレクトリを作成する
readdir ディレクトリの内容を読み取る
rmdir ディレクトリを削除する

以上です!今、あなたはNode.jsのファイルシステム操作の基本を習得しました。实践が完璧を生むことを忘れずに、これらのメソッドを試してみてください。快乐なコーディングを!

Credits: Image by storyset