Kodokon kodokon.com

ファイルシステム:fs/promisesで読み書きする

fs/promisesモジュールでファイルを読み書きし、pathモジュールのおかげで信頼できるパスを組み立てましょう。

8 分 · 3 問

このレッスンを Kodokon で開く

ブラウザでは、JavaScriptはディスク上のファイルに触れることを許されていません。セキュリティの問題です。一方でNodeはあなたのマシン上で直接動き、fsモジュール(file system)のおかげでファイルを読み書きできます。私たちはそのモダンな版、fs/promisesを使います。そのすべての関数はプロミスを返します。JavaScript講座で見たように、awaitで待つ方法はもう知っていますね。インポートのnode:という接頭辞に注目してください。これは、モジュールがnode_modulesからではなくNode自身から来ていることを明確にします。そして良い知らせです。ESモジュールでは、awaitは囲む関数なしで、ファイルのレベルで直接動きます。

JAVASCRIPT
import { writeFile } from "node:fs/promises";

await writeFile("notes.txt", "First note\n");
console.log("File created!");
writeFileは、notes.txtファイルが存在しなければ、第二パラメーターとして渡されたテキストとともに作成します。

読み取りも、readFileで同じ理屈です。その第二パラメーターが重要です。utf8エンコーディング、つまりディスクに保存されたバイトを読めるテキストに翻訳する方法を指定します。省略すると、Nodeは文字列の代わりにBufferオブジェクト、つまり生のバイトを返します。

JAVASCRIPT
import { readFile } from "node:fs/promises";

const text = await readFile("notes.txt", "utf8");
console.log(text);
ファイルの中身が文字列として届き、操作できる状態になります。

パスの話をしましょう。相対パス(notes.txtdata/log.txt)は現在のフォルダから始まります。絶対パス(C:\.../home/...)はディスクのルートから始まります。よくある罠があります。Windowsはフォルダを\で区切り、macOSとLinuxは/で区切ります。pathモジュールがこの問題を解決します。path.joinは、どんなシステムでも正しい区切り文字で部品を組み立てます。フォルダを作るmkdirと組み合わせてみましょう。

JAVASCRIPT
import path from "node:path";
import { mkdir, writeFile } from "node:fs/promises";

const file = path.join("data", "log.txt");

await mkdir("data", { recursive: true });
await writeFile(file, "First log\n");
console.log("Written to:", file);
recursiveオプションは、dataフォルダがすでに存在する場合のエラーを避けます。

理解度チェック

このレッスンの要点をしっかり覚えているか確認しましょう。

  1. 第二パラメーターのutf8を省略すると、readFileは何を返しますか?
    • 空の文字列
    • エラー。エンコーディングは必須
    • Buffer、つまりファイルの生のバイト
  2. 対象のファイルがすでに存在する場合、writeFileは何をしますか?
    • 既存の中身をすべて新しいテキストで置き換える
    • 新しいテキストをファイルの末尾に追加する
    • 書き込みを拒否してエラーを投げる
    • 自動的にバックアップのコピーを作る
  3. パスを組み立てるうえでpath.joinの利点は何ですか?
    • パスの足りないフォルダを作る
    • システムに合った正しい区切り文字で部品を組み立てる
    • 続行する前にファイルが存在するか確認する