序章

ファイルの操作は、開発以外の目的と同様に、開発目的でも一般的です。 日常のコンピュータの使用では、ダウンロードしたファイルの保存や別のアプリケーションで使用するデータへのアクセスなどのタスクを実行するために、ユーザーはさまざまなディレクトリのファイルに対してデータの読み取りと書き込みを行う可能性があります。 同様に、バックエンドプログラムまたはコマンドラインインターフェイス(CLI)ツールは、ダウンロードしたデータを保存するためにファイルに書き込む必要がある場合や、データ集約型のアプリケーションをJSONにエクスポートする必要がある場合があります。 ]、 CSV 、またはExcel形式。 これらのプログラムは、それらが実行されているオペレーティングシステムのファイルシステムと通信する必要があります。

Node.js を使用すると、組み込みのfsモジュールを使用してファイルをプログラムで操作できます。 名前は「ファイルシステム」の略で、モジュールには、ローカルマシン上のファイルの読み取り、書き込み、および削除に必要なすべての機能が含まれています。 Node.jsのこのユニークな側面により、JavaScriptはバックエンドおよびCLIツールのプログラミングに役立つ言語になっています。

この記事では、 fs モジュールを使用して、コマンドラインで作成されたファイルを読み取り、新しいファイルを作成して書き込み、作成したファイルを削除して、最初のファイルを別のフォルダーに移動します。 The fs モジュールは、同期、非同期、またはストリームを介したファイルとの対話をサポートします。 このチュートリアルでは、Node.js開発者が最も一般的に使用する方法である非同期のPromiseベースのAPIの使用方法に焦点を当てます。

前提条件

  • にアクセスするには、コンピューターにNode.jsがインストールされている必要があります fs モジュールを作成し、チュートリアルに従います。 このチュートリアルでは、Node.jsバージョン10.22.0を使用します。 Node.jsをmacOSまたはUbuntu18.04にインストールするには、Node.jsをインストールしてmacOSにローカル開発環境を作成する方法またはPPAを使用したインストールセクションの手順に従います。 X199X] Ubuntu18.04にNode.jsをインストールする方法。

  • この記事では、JavaScript Promisesを使用して、ファイル、特に async/await 構文。 Promisesに慣れていない場合は、 async/await 構文または非同期プログラミングについては、Node.jsで非同期コードを作成する方法に関するガイドをご覧ください。

ステップ1—でファイルを読む readFile()

このステップでは、Node.jsのファイルを読み取るプログラムを作成します。 これを行うには、インポートする必要があります fs モジュール、ファイルを操作するための標準のNode.jsモジュール、そしてモジュールの readFile() 関数。 プログラムはファイルを読み取り、その内容を変数に格納してから、その内容をコンソールに記録します。

最初のステップは、このアクティビティと後のセクションのコーディング環境をセットアップすることです。

コードを保存するフォルダーを作成します。 ターミナルで、というフォルダを作成します node-files:

  1. mkdir node-files

作業ディレクトリを新しく作成したフォルダに変更します。 cd 指図:

  1. cd node-files

このフォルダに、2つのファイルを作成します。 最初のファイルは、プログラムが後で読み取るコンテンツを含む新しいファイルになります。 2番目のファイルは、ファイルを読み取るNode.jsモジュールになります。

ファイルを作成する greetings.txt 次のコマンドを使用します。

  1. echo "hello, hola, bonjour, hallo" > greetings.txt

The echo コマンドは、そのstring引数を端末に出力します。 あなたが使う > リダイレクトechoの新しいファイルへの出力、 greetings.txt.

次に、作成して開きます readFile.js 選択したテキストエディタで。 このチュートリアルでは、 nano、ターミナルテキストエディタ。 このファイルは次のコマンドで開くことができます nano このような:

  1. nano readFile.js

このファイルのコードは、3つのセクションに分けることができます。 まず、プログラムがファイルを操作できるようにするNode.jsモジュールをインポートする必要があります。 テキストエディタで、次のコードを入力します。

node-files / readFile.js
const fs = require('fs').promises;

前述のように、 fs ファイルシステムと対話するためのモジュール。 ただし、インポートしていることに注意してください。 .promises モジュールの一部。

いつ fs モジュールが最初に作成されました。Node.jsで非同期コードを記述する主な方法は、コールバックを使用することでした。 約束の人気が高まるにつれ、Node.jsチームは fs 箱から出してモジュール。 Node.jsバージョン10では、彼らは promises のオブジェクト fs 約束を使用するモジュール、メイン fs モジュールは、コールバックを使用する関数を引き続き公開します。 このプログラムでは、モジュールのPromiseバージョンをインポートしています。

モジュールがインポートされたら、非同期関数を作成してファイルを読み取ることができます。 非同期関数は、 async キーワード。 非同期関数を使用すると、を使用してpromiseを解決できます。 await キーワード、約束を連鎖させる代わりに .then() 方法。

新しい関数を作成する readFile() 1つの引数、と呼ばれる文字列を受け入れる filePath. 君の readFile() 関数はを使用します fs を使用してファイルを変数にロードするモジュール async/await 構文。

次の強調表示されたコードを入力します。

node-files / readFile.js
const fs = require('fs').promises;

async function readFile(filePath) {
  try {
    const data = await fs.readFile(filePath);
    console.log(data.toString());
  } catch (error) {
    console.error(`Got an error trying to read the file: ${error.message}`);
  }
}

関数を定義するには、 async 後で付随するものを使用できるようにキーワード await キーワード。 非同期ファイル読み取り操作のエラーをキャプチャするには、次の呼び出しを囲みます。 fs.readFile() try…catchブロックを使用します。 以内 try セクションでは、ファイルをにロードします data 変数 fs.readFile() 関数。 その関数に必要な唯一の引数は、文字列として指定されたファイルパスです。

The fs.readFile() デフォルトでbufferオブジェクトを返します。 A buffer オブジェクトは、あらゆる種類のファイルタイプを格納できます。 ファイルの内容をログに記録するときは、を使用してそれらのバイトをテキストに変換します。 toString() バッファオブジェクトのメソッド。

エラーが検出された場合、通常はファイルが見つからないか、プログラムにファイルを読み取る権限がない場合は、受信したエラーをコンソールに記録します。

最後に、で関数を呼び出します greetings.txt 次の強調表示された行を含むファイル:

node-files / readFile.js
const fs = require('fs').promises;

async function readFile(filePath) {
  try {
    const data = await fs.readFile(filePath);
    console.log(data.toString());
  } catch (error) {
    console.error(`Got an error trying to read the file: ${error.message}`);
  }
}

readFile('greetings.txt');

必ず内容を保存してください。 と nano、を押して保存して終了できます CTRL+X.

これで、プログラムは greetings.txt 以前に作成したファイルとその内容をターミナルに記録します。 モジュールを実行してこれを確認します node:

  1. node readFile.js

次の出力が表示されます。

Output
hello, hola, bonjour, hallo

これで、 fs モジュールの readFile() を使用して機能する async/await 構文。

注:以前のバージョンのNode.jsでは、を使用すると次の警告が表示されます。 fs モジュール:

(node:13085) ExperimentalWarning: The fs.promises API is experimental

The promises のオブジェクト fs モジュールはNode.jsバージョン10で導入されたため、以前のバージョンの中にはまだモジュールを実験的なものと呼んでいるものがあります。 この警告は、バージョン12.6でAPIが安定したときに削除されました。

これで、 fs モジュールでは、次にファイルを作成し、それにテキストを書き込みます。

ステップ2—でファイルを書く writeFile()

このステップでは、次のコマンドでファイルを書き込みます。 writeFile() の機能 fs モジュール。 食料品の請求書を追跡するCSVファイルをNode.jsに作成します。 初めてファイルを作成するときに、ファイルを作成してヘッダーを追加します。 2回目は、ファイルにデータを追加します。

テキストエディタで新しいファイルを開きます。

  1. nano writeFile.js

をインポートしてコードを開始します fs モジュール:

node-files / writeFile.js
const fs = require('fs').promises;

引き続き使用します async/await 2つの関数を作成するときの構文。 最初の機能は、CSVファイルを作成することです。 2番目の機能は、CSVファイルにデータを追加することです。

テキストエディタで、次の強調表示されたコードを入力します。

node-files / writeFile.js
const fs = require('fs').promises;

async function openFile() {
  try {
    const csvHeaders = 'name,quantity,price'
    await fs.writeFile('groceries.csv', csvHeaders);
  } catch (error) {
    console.error(`Got an error trying to write to a file: ${error.message}`);
  }
}

この非同期関数は、最初に csvHeaders CSVファイルの列見出しを含む変数。 次に、 writeFile() の機能 fs ファイルを作成してデータを書き込むモジュール。 最初の引数はファイルパスです。 ファイル名だけを指定したので、Node.jsは、コードを実行しているのと同じディレクトリにファイルを作成します。 2番目の引数は、書き込んでいるデータです。この場合は、 csvHeaders 変数。

次に、食料品リストにアイテムを追加するための新しい関数を作成します。 テキストエディタに次の強調表示された関数を追加します。

node-files / writeFile.js
const fs = require('fs').promises;

async function openFile() {
  try {
    const csvHeaders = 'name,quantity,price'
    await fs.writeFile('groceries.csv', csvHeaders);
  } catch (error) {
    console.error(`Got an error trying to write to a file: ${error.message}`);
  }
}

async function addGroceryItem(name, quantity, price) {
  try {
    const csvLine = `\n${name},${quantity},${price}`
    await fs.writeFile('groceries.csv', csvLine, { flag: 'a' });
  } catch (error) {
    console.error(`Got an error trying to write to a file: ${error.message}`);
  }
}

非同期 addGroceryItem() 関数は、食料品の名前、購入する金額、および単位あたりの価格の3つの引数を受け入れます。 これらの引数は、templateリテラル構文とともに使用されて csvLine 変数。ファイルに書き込んでいるデータです。

次に、 writeFile() あなたがしたように方法 openFile() 関数。 ただし、今回は3番目の引数があります:JavaScriptオブジェクト。 このオブジェクトには flag 値を持つキー a. フラグは、Node.jsにシステム上のファイルとの対話方法を指示します。 フラグを使用して a、ファイルを上書きするのではなく、ファイルに追加するようにNode.jsに指示しています。 フラグを指定しない場合、デフォルトで次のようになります。 w、存在しない場合は新しいファイルを作成し、すでに存在する場合はファイルを上書きします。 ファイルシステムフラグの詳細については、Node.jsのドキュメントをご覧ください。

スクリプトを完成させるには、これらの関数を使用してください。 ファイルの最後に次の強調表示された行を追加します。

node-files / writeFile.js
...
async function addGroceryItem(name, quantity, price) {
  try {
    const csvLine = `\n${name},${quantity},${price}`
    await fs.writeFile('groceries.csv', csvLine, { flag: 'a' });
  } catch (error) {
    console.error(`Got an error trying to write to a file: ${error.message}`);
  }
}

(async function () {
  await openFile();
  await addGroceryItem('eggs', 12, 1.50);
  await addGroceryItem('nutella', 1, 4);
})();

関数を呼び出すには、最初にラッパー関数を作成します。 async function. 以来 await このチュートリアルの執筆時点では、キーワードをグローバルスコープから使用することはできません。非同期関数をでラップする必要があります。 async function. この関数は匿名であることに注意してください。つまり、この関数を識別するための名前がありません。

君の openFile()addGroceryItem() 関数は非同期関数です。 これらの呼び出しを別の関数で囲むことなく、コンテンツの順序を保証することはできません。 作成したラッパーは、 async キーワード。 その関数内で、を使用して関数呼び出しを注文します await キーワード。

最後に、 async function 定義は括弧で囲まれています。 これらはJavaScriptに、その中のコードが関数式であることを伝えます。 関数の最後でセミコロンの前の括弧は、関数をすぐに呼び出すために使用されます。 これは、即時呼び出し関数式(IIFE)と呼ばれます。 匿名関数でIIFEを使用することにより、コードが3行のCSVファイルを生成することをテストできます:列ヘッダー、 eggs、およびの最後の行 nutella.

保存して終了 nanoCTRL+X.

次に、でコードを実行します node 指図:

  1. node writeFile.js

出力はありません。 ただし、新しいファイルは現在のディレクトリに存在します。

使用 cat の内容を表示するコマンド groceries.csv:

  1. cat groceries.csv

次の出力が表示されます。

node-files / groceries.csv
name,quantity,price
eggs,12,1.5
nutella,1,4

へのあなたの呼び出し openFile() 新しいファイルを作成し、CSVの列見出しを追加しました。 その後の呼び出し addGroceryItem() 次に、2行のデータを追加しました。

とともに writeFile() 機能、あなたはファイルを作成し、編集することができます。 次に、ファイルを削除します。これは、一時ファイルがある場合やハードドライブにスペースを確保する必要がある場合の一般的な操作です。

このステップでは、ファイルを削除します unlink() の機能 fs モジュール。 Node.jsスクリプトを記述して、 groceries.csv 前のセクションで作成したファイル。

ターミナルで、このNode.jsモジュールの新しいファイルを作成します。

  1. nano deleteFile.js

次に、非同期を作成するコードを記述します deleteFile() 関数。 その関数は、ファイルパスを引数として受け入れ、それを unlink() ファイルシステムからそれを削除する関数。

テキストエディタで、次のコードを記述します。

node-files / deleteFile.js
const fs = require('fs').promises;

async function deleteFile(filePath) {
  try {
    await fs.unlink(filePath);
    console.log(`Deleted ${filePath}`);
  } catch (error) {
    console.error(`Got an error trying to delete the file: ${error.message}`);
  }
}

deleteFile('groceries.csv');

The unlink() 関数は1つの引数を受け入れます:削除したいファイルのファイルパス。

警告:ファイルを削除する場合 unlink() 機能、それはあなたのごみ箱に送られません、またはゴミ箱はあなたのファイルシステムから永久に取り除かれます。 このアクションは元に戻せないため、コードを実行する前にファイルを削除することを確認してください。

出口 nano、次のように入力してファイルの内容を確実に保存します CTRL+X.

次に、プログラムを実行します。 ターミナルで次のコマンドを実行します。

  1. node deleteFile.js

次の出力が表示されます。

Output
Deleted groceries.csv

ファイルが存在しないことを確認するには、 ls 現在のディレクトリのコマンド:

  1. ls

このコマンドは、次のファイルを表示します。

Output
deleteFile.js greetings.txt readFile.js writeFile.js

これで、ファイルが削除されたことを確認しました。 unlink() 関数。

これまで、ファイルの読み取り、書き込み、編集、および削除の方法を学習しました。 次のセクションでは、関数を使用してファイルを別のフォルダーに移動します。 その機能を学習すると、Node.jsで最も重要なファイル管理タスクを実行できるようになります。

ステップ4—でファイルを移動する rename()

フォルダはファイルを整理するために使用されるため、プログラムでファイルをあるフォルダから別のフォルダに移動できると、ファイル管理が容易になります。 rename()関数を使用して、Node.js内のファイルを移動できます。 このステップでは、のコピーを移動します greetings.txt 新しいフォルダにファイルします。

Node.jsモジュールをコーディングする前に、いくつかの設定を行う必要があります。 ファイルの移動先となるフォルダを作成することから始めます。 ターミナルで、 test-data 現在のディレクトリのフォルダ:

  1. mkdir test-data

今、コピーします greetings.txt 最初のステップで使用されたファイル cp 指図:

  1. cp greetings.txt greetings-2.txt

コードを含むJavaScriptファイルを開いて、セットアップを完了します。

  1. nano moveFile.js

Node.jsモジュールで、という関数を作成します moveFile() それは rename() 関数。 使用する場合 rename() 関数の場合、元のファイルのファイルパスと宛先の場所のパスを指定する必要があります。 この例では、 moveFile() 移動する機能 greetings-2.txt ファイルに test-data フォルダ。 名前も次のように変更します salutations.txt.

開いているテキストエディタに次のコードを入力します。

node-files / moveFile.js
const fs = require('fs').promises;

async function moveFile(source, destination) {
  try {
    await fs.rename(source, destination);
    console.log(`Moved file from ${source} to ${destination}`);
  } catch (error) {
    console.error(`Got an error trying to move the file: ${error.message}`);
  }
}

moveFile('greetings-2.txt', 'test-data/salutations.txt');

前述のように、 rename() 関数は、ソースファイルパスと宛先ファイルパスの2つの引数を取ります。 この関数は、ファイルを他のフォルダに移動したり、現在のディレクトリ内のファイルの名前を変更したり、同時に移動して名前を変更したりできます。 コードでは、ファイルを移動して名前を変更しています。

保存して終了 nano を押すことによって CTRL+X.

次に、このプログラムを実行します node. プログラムを実行するには、次のコマンドを入力します。

  1. node moveFile.js

次の出力が表示されます。

Output
Moved file from greetings-2.txt to test-data/salutations.txt

ファイルが現在のディレクトリに存在しないことを確認するには、 ls 指図:

  1. ls

このコマンドは、これらのファイルとフォルダーを表示します。

Output
deleteFile.js greetings.txt moveFile.js readFile.js test-data writeFile.js

これで使用できます ls 内のファイルを一覧表示するには test-data サブフォルダー:

  1. ls test-data

移動したファイルが出力に表示されます。

Output
salutations.txt

これで、 rename() 現在のディレクトリからサブフォルダにファイルを移動する関数。 また、同じ関数呼び出しでファイルの名前を変更しました。

結論

この記事では、Node.jsでファイルを管理するためのさまざまな機能を学びました。 最初にファイルの内容を次のようにロードしました readFile(). 次に、新しいファイルを作成し、既存のファイルにデータを追加しました。 writeFile() 関数。 でファイルを完全に削除しました unlink() 関数を選択し、ファイルを移動して名前を変更します。 rename().

プログラムでファイルを操作することは、Node.jsの重要な機能です。 プログラムは、ユーザーが使用できるようにファイルを出力する必要がある場合や、常に実行されているとは限らないアプリケーションのデータを保存する必要がある場合があります。 とともに fs モジュールの機能である開発者は、Node.jsプログラムでのファイルの使用方法を制御できます。

詳細については、 fs モジュールでは、Node.jsのドキュメントを読むことができます。 Node.jsの学習を継続したい場合は、 Node.jsシリーズのコーディング方法に戻るか、Nodeトピックページでプログラミングプロジェクトとセットアップを参照してください。