Programming PR

【TypeScript】ファイル操作の基本!読み込みや削除など9通り解説

【TypeScript】ファイル操作の基本!読み込みや削除など9通りを解説
記事内に商品プロモーションを含む場合があります

こんにちは!
今日はTypeScriptを使ったファイル操作の基本について学びましょう。
ファイルの読み込み、書き込み、削除など、日々のプログラミング作業で非常に役立つ技術を10通り紹介します。
特に、Node.jsの fs/promises モジュールを活用して、非同期でファイル操作を行う方法を中心に解説します。
これにより、コールバック地獄に陥ることなく、より簡潔で読みやすいコードが書けるようになりますよ。

ファイルを読み込む

ファイルの読み込みはプログラミングにおいて基本中の基本ですね。
TypeScriptを使ったファイル操作で最もよく使われるのが、ファイルの読み込みです。
ここでは、Node.jsの fs/promises モジュールを使って、非同期的にファイルを読み込む方法を見ていきましょう。

まずは、次のようなサンプルコードをご覧ください。


import { readFile } from "fs/promises";

async function loadFile(): Promise<void> {
  try {
    const data: string = await readFile("./path/to/file/sample.txt", "utf8");
    console.log(data);
  } catch (error) {
    console.error("ファイルの読み込みに失敗しました:", error);
  }
}

loadFile();

このコードでは、指定されたパスのファイルをUTF-8の文字コードで読み込み、その内容をコンソールに表示しています。
エラーが発生した場合は、例外をキャッチしてエラーメッセージを表示します。
非同期処理のため、他の処理をブロックせずに効率的にファイルを読み込むことができます。

この方法を使えば、大きなファイルでもメモリを過度に消費することなく、スムーズに処理を行うことが可能です。

ファイルを書き込む

ファイルにデータを書き込むことは、アプリケーションで生成したデータを保存する際に必要ですね。
非常に簡単な操作で、データの保存が可能になります。

サンプルコードを見てみましょう。


import { writeFile } from "fs/promises";

async function saveFile(): Promise<void> {
  const data = "こんにちは、TypeScript!";
  try {
    await writeFile("./path/to/file/sample.txt", data, "utf8");
    console.log("ファイルが正常に書き込まれました。");
  } catch (error) {
    console.error("ファイルの書き込みに失敗しました:", error);
  }
}

saveFile();

この関数では、指定されたパスにテキストデータをUTF-8形式で保存しています。

データをファイルに書き込むときは、正確なファイルパスとデータエンコーディングを指定することが重要です。
これで、自分のアプリケーションから出力したデータを安全に保存し、必要なときにいつでもアクセスできるようになりますよ。

ディレクトリを作成する

新しいプロジェクトを始める際や、ファイルを整理するためにディレクトリ(フォルダ)を作成する必要があることはよくあります。
Node.jsでディレクトリを作成する方法もとてもシンプルです。

以下のサンプルコードを参考にしてみてください。


import { mkdir } from "fs/promises";

async function createDirectory(): Promise<void> {
  try {
    await mkdir("./path/to/new/directory", { recursive: true });
    console.log("ディレクトリが正常に作成されました。");
  } catch (error) {
    console.error("ディレクトリの作成に失敗しました:", error);
  }
}

createDirectory();

ここでのキーポイントは、recursive: true オプションです。
このオプションがあることで、指定したパスに必要な中間ディレクトリも自動で作成されるため、一連のフォルダ構造を一度に作成することができます。

この機能は、複雑なフォルダ構造をプログラムから自動的にセットアップしたい時に特に便利です。

ファイルを削除する

時には不要になったファイルを削除する必要があります。
Node.jsでは、この操作も非常に簡単に行えます。

次のサンプルコードで削除方法を確認しましょう。


import { unlink } from "fs/promises";

async function deleteFile(): Promise<void> {
  try {
    await unlink("./path/to/file/sample.txt");
    console.log("ファイルが正常に削除されました。");
  } catch (error) {
    console.error("ファイルの削除に失敗しました:", error);
  }
}

deleteFile();

この関数は、指定されたパスのファイルを削除します。

ファイルを削除するときは、間違ったファイルを削除しないように、パスを正確に指定することが重要です。
また、削除する前には必要なバックアップを取るなどの対策を忘れないようにしましょう。

ファイルの名前を変更する

既存のファイルのファイル名を変更する必要が出てくることがありますね。
Node.jsでファイル名を変更する操作も、簡単に行えます。

ファイル名の変更方法を示すサンプルコードを見てみましょう。


import { rename } from "fs/promises";

async function renameFile(): Promise<void> {
  try {
    await rename("./path/to/file/oldFile.txt", "./path/to/file/newFile.txt");
    console.log("ファイル名が正常に変更されました。");
  } catch (error) {
    console.error("ファイル名の変更に失敗しました:", error);
  }
}

renameFile();

この関数は、指定された古いファイル名から新しいファイル名へと変更します。
renameの第一引数にはファイル名を変更したいファイルを、第二引数には変更後のファイル名を指定しましょう。

ファイル名を変更する際は、新しい名前が既に存在していないかどうかを確認することが重要です。
これにより、無駄なエラーを避け、スムーズなファイル管理が可能になります。
正しいファイル名の管理は、効率的なデータアクセスにも繋がりますよ。

ファイルの存在チェックする

ファイル操作を行う前に、そのファイルが存在するかどうかを確認することは非常に重要です。
これにより、存在しないファイルに対する操作を試みてエラーが発生するのを防ぐことができます。

ファイルの存在を確認する方法を見てみましょう。


import { access } from "fs/promises";

async function checkFileExists(): Promise<void> {
  try {
    await access("./path/to/file/sample.txt");
    console.log("ファイルは存在します。");
  } catch {
    console.log("ファイルは存在しません。");
  }
}

checkFileExists();

このコードでは、access関数を使ってファイルの存在をチェックしています。
ファイルが存在すれば、正常に処理を進めることができ、存在しない場合は適切なメッセージを表示します。

このようにファイルの存在を確認するステップを踏むことで、より確実にファイル操作を行うことができるでしょう。
エラーを未然に防ぐことは、安定したアプリケーション運用の基本ですね。

ディレクトリの内容を読み取る

どのファイルやフォルダが存在するかを知ることは、日々の作業を効率化するのに非常に役立ちます。
Node.jsでディレクトリの内容を一覧表示する方法を見てみましょう。

こちらがディレクトリ内容を読み取るサンプルコードです。


import { readdir } from "fs/promises";

async function listDirectoryContents(): Promise<void> {
  try {
    const files: string[] = await readdir("./path/to/file");
    files.forEach((x) => console.log("ディレクトリの内容:", x));
  } catch (error) {
    console.error("ディレクトリの読み取りに失敗しました:", error);
  }
}

listDirectoryContents();

このスクリプトは、指定されたディレクトリの中身をリストアップし、コンソールに表示します。
返ってくるのはディレクトリの中身はstring型の配列です。

たとえば、次のようなディレクトリ構造の場合。

ディレクトリ構造

root
  ┗path
    ┗to
      ┗file
        ┣sample.doc
        ┣sample.md
        ┗sample.txt

次のように出力されます。

出力

ディレクトリの内容: sample.doc
ディレクトリの内容: sample.md
ディレクトリの内容: sample.txt

ディレクトリの内容を確認することで、ファイル管理がより一層スムーズになりますし、どんなファイルやフォルダが存在しているのかを一目で把握できるようになりますね。

ファイルの状態を取得する

ファイルやディレクトリの詳細な属性を知ることは、セキュリティ上のチェックや、バックアップ処理、ログの管理など多くのシナリオで重要です。
Node.jsでは、ファイルの状態を取得するための便利な関数が提供されています。

ファイルの状態を取得する方法についてのサンプルコードを見てみましょう。


import { stat } from "fs/promises";

async function getFileStatus(): Promise<void> {
  try {
    const stats = await stat("./path/to/file/sample.txt");
    console.log("ファイルサイズ:", stats.size);
    console.log("作成時間:", stats.birthtime);
    console.log("最終アクセス時間:", stats.atime);
    console.log("最終変更時間:", stats.mtime);
  } catch (error) {
    console.error("ファイル状態の取得に失敗しました:", error);
  }
}

getFileStatus();

この関数は、指定されたファイルの状態を取得し、そのサイズやタイムスタンプなどの情報を表示します。

出力

ファイルサイズ: 34
作成時間: 2024-04-17T15:44:01.870Z
最終アクセス時間: 2024-04-18T10:41:36.976Z
最終変更時間: 2024-04-18T10:41:34.171Z

ファイルの属性を正確に理解することは、システムの整合性を維持し、適切なファイル管理を行う上で非常に役立ちます。

ファイルを監視する

ファイルが変更された時に即座に反応する必要がある場合、ファイル監視機能は非常に便利です。
例えば、設定ファイルが更新された際にアプリケーションが自動で設定を再読み込みするようなシナリオでは、この機能が役立ちます。

Node.jsでファイルを監視する方法をサンプルコードを通じて確認しましょう。


import { watch } from "fs/promises";

async function watchFile(): Promise<void> {
  const watcher = watch("./path/to/file/sample.txt");

  for await (const event of watcher) {
    console.log(`ファイルに変更がありました: ${event.eventType}(${event.filename})`);
  }
}

watchFile();

この関数は、指定されたファイルやディレクトリの変更を監視します。
変更が検出されるたびに、その種類(追加、変更、削除など)やファイル名がコンソールに表示されるんです。

たとえば、ファイルの内容を変更したとき、ファイル名を変更した時は以下のように出力されます。

出力

ファイルに変更がありました: change(sample.txt)
ファイルに変更がありました: rename(sample2.txt)

このようにファイルを監視することで、リアルタイムでの変更に迅速に対応することが可能となり、システム管理や動的なアプリケーションの開発に大きなメリットをもたらします。

fsモジュールとfs/promisesモジュールの違い

Node.jsでファイルシステムを扱う際、主に fs モジュールと fs/promises モジュールが利用されますが、これらはどう違うのでしょうか?
さらに、どちらが推奨されるのでしょうか?見ていきましょう。

fs モジュールはNode.jsの初期から存在しており、コールバック関数を使って非同期操作を行う伝統的なAPIです。
一方、fs/promises モジュールはPromiseベースのAPIを提供し、より新しく、async/await 構文を使用することで、直感的で読みやすいコードを実現します。

こちらは fs モジュールを使ったコードの例ですが、`import`構文を使用しています。


import { readFile } from "fs";

readFile("./path/to/file/sample.txt", "utf-8", (err, data) => {
  if (err) throw err;
  console.log(data);
});

対照的に、fs/promises モジュールを使った場合のコードは次のようになります。


import { readFile } from "fs/promises";

async function readMyFile(): Promise<void> {
  try {
    const data = await readFile("./path/to/file/sample.txt", "utf-8");
    console.log(data);
  } catch (error) {
    console.error("読み込みに失敗しました:", error);
  }
}

readMyFile();

この比較から分かる通り、fs/promises モジュールはエラーハンドリングを含めて、より現代的で直感的なコーディングスタイルを可能にします。
そのため、新しいプロジェクトにおいては、fs/promises モジュールの使用が推奨されます。
より簡潔で、管理しやすいコードを書くことができるからです。

どちらのモジュールもその場のニーズに応じて使い分けることが可能ですが、特に非同期処理を多用する現代のアプリケーション開発においては、fs/promises モジュールの方がより適しています。

キャリア形成/給与還元
ひとつひとつ真摯に向き合う企業
ONE_WEDGE社員募集

株式会社 ONE WEDGEでは、新たな仲間を募集しています!

私たちと一緒に、革新的で充実したキャリアを築きませんか?
当社は、従業員が仕事と私生活のバランスを大切にできるよう、充実した福利厚生を整えています。

  • 完全週休2日制(土日休み)で、祝日や夏季休暇、年末年始休暇もしっかり保証!
  • 様々な休暇制度(有給、慶弔、産前・産後、育児、バースデー休暇)を完備!
  • 従業員の成長と健康を支援するための表彰制度、資格取得支援、健康促進手当など!
  • 生活を支えるテレワーク手当、記事寄稿手当、結婚祝金・出産祝金など、様々な手当を提供!
  • 自己啓発としての書籍購入制度や、メンバー間のコミュニケーションを深める交流費補助!
  • 成果に応じた決算賞与や、リファラル採用手当、AI手当など、頑張りをしっかり評価!
  • ワークライフバランスを重視し、副業もOK!

株式会社 ONE WEDGEでは、一人ひとりの従業員が自己実現できる環境を大切にしています。
共に成長し、刺激を与え合える仲間をお待ちしております。
あなたの能力と熱意を、ぜひ当社で発揮してください。
ご応募お待ちしております!

ホームページ、採用情報は下記ボタンからご確認ください!

応募、ご質問など、LINEでお気軽にご相談ください♪

まとめ

今日はTypeScriptを使用して、ファイル操作のさまざまな方法について学びました。
ファイルを読み込むことから、ファイルを監視するまで、基本的な操作から応用的なテクニックまで幅広くカバーしましたね。

これらの知識を活用することで、あなたのプロジェクトにおいても、より効率的かつ効果的にファイルシステムを扱うことが可能になります。
実際にコードを書きながら試すことで、理解がさらに深まるはずです。

何か不明な点があれば、ドキュメントを参照するか、さらに詳しい情報を求めてコミュニティに問い合わせてみてください。
これからも安全で効果的なコードを書いていくために、今日学んだことをぜひ活用してくださいね。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です