Nodejs でモジュール fs ファイルシステムを使用する方法

Nodejs でモジュール fs ファイルシステムを使用する方法

概要

Node の fs ドキュメントには多くの API が含まれており、ファイル システム操作を完全にサポートしています。ドキュメントはよく整理されており、操作は基本的にファイル操作、ディレクトリ操作、ファイル情報、ストリームに分かれています。プログラミング方法は同期、非同期、Promiseもサポートしています。

この記事では、ドキュメントで詳細に説明されていないいくつかの問題を記録し、fs ドキュメントのアイデアをよりよく結び付けることができます。

  • ファイル記述子
  • 同期、非同期、Promise
  • カタログとカタログ項目
  • ファイル情報
  • ストリーム

ファイル記述子

ファイル記述子は負でない整数です。これは、オペレーティング システムが対応するファイルを見つけるために使用できるインデックス値です。

fs の多くの低レベル API では、ファイル記述子が必要です。ドキュメントでは、記述子は通常 fd で表されます。たとえば、fs.read(fd, buffer, offset, length, position, callback) です。対応する API は、fs.readFile(path[, options], callback) です。

オペレーティング システムにはファイル記述子の数に制限があるため、ファイル操作が完了したらファイルを閉じることを忘れないでください。

定数 fs = require("fs");

fs.open("./db.json", "r", (err, fd) => {
    (err) の場合、err をスローします。
    // ファイル操作...
    // 操作が完了したら、ファイルを閉じます fs.close(fd, err => {
        (err) の場合、err をスローします。
    });
});

同期、非同期、Promise

すべてのファイル システム API には、同期形式と非同期形式の両方があります。

同期書き込み

同期 API はスレッドをブロックするため、使用はお勧めしません。

試す {
    const buf = fs.readFileSync("./package.json");
    console.log(buf.toString("utf8"));
} キャッチ(エラー){
    console.log(エラーメッセージ);
}

非同期書き込み

非同期書き込みでは、コールバック地獄に陥りやすくなります。

fs.readFile("./package.json", (err, データ) => {
    (err) の場合、err をスローします。
    コンソールにログ出力します。
});

(推奨)約束​​事の書き方

Node v12 より前では、Promise カプセル化を自分で使用する必要があります。

関数 readFilePromise(パス、エンコーディング = "utf8") {
    const promise = new Promise((resolve, deny) => {
        fs.readFile(パス、(エラー、データ) => {
            (err) の場合は、reject(err) を返します。
            解決を返します(data.toString(encoding));
        });
    });
    返却約束;
}

readFilePromise("./package.json").then(res => console.log(res));

Node v12 では、fs Promise API が導入されました。コールバックを使用する代わりに、Promise オブジェクトを返します。 API は require('fs').promises を介してアクセスできます。これにより開発コストが削減されます。

const fsPromises = require("fs").promises;

fsPromises
    .readFile("./package.json", {
        エンコーディング: "utf8",
        フラグ: "r"
    })
    .then(コンソール.log)
    .catch(コンソール.エラー);

カタログとカタログ項目

fs.Dirクラス: ファイルディレクトリに関連する操作をカプセル化します

fs.Dirent クラス: ディレクトリ エントリに関連する操作をカプセル化します。たとえば、デバイス タイプ (文字、ブロック、FIFO など) を決定します。

それらの関係はコードで示されています:

const fsPromises = require("fs").promises;

非同期関数main() {
    const dir = fsPromises.opendir(".") を待機します。
    dirent = null とします。
    ((dirent = await dir.read()) !== null) の間 {
        console.log(dirent.name);
    }
}

主要();

ファイル情報

fs.Stats クラス: ファイル情報に関連する操作をカプセル化します。これは fs.stat() コールバック関数で返されます。

fs.stat("./package.json", (err, 統計) => {
    (err) の場合、err をスローします。
    console.log(統計);
});

ファイルが存在するかどうかを確認する際の注意:

  • fs.open()、fs.readFile()、または fs.writeFile() を呼び出す前に、fs.stat() を使用してファイルが存在するかどうかを確認することは推奨されません。代わりに、ファイルを直接開いて読み取りまたは書き込みを行い、ファイルが利用できない場合に発生するエラーを処理する必要があります。
  • ファイルが存在するかどうかを確認し、その後操作しない場合は、fs.access() を使用することをお勧めします。

ReadStream と WriteStream

Node.js では、stream は非常に重要なライブラリです。多くのライブラリの API はストリームに基づいてカプセル化されています。たとえば、以下で説明する fs の ReadStream と WriteStream などです。

fs 自体は readFile と writeFile を提供しますが、その有用性の代償として、すべてのコンテンツが一度にメモリにロードされるため、パフォーマンスの問題が発生します。しかし、数 GB の大きなファイルの場合、明らかに問題が発生します。

したがって、大きなファイルに対する解決策は当然、ファイルを少しずつ読み取ることです。これにはストリームの使用が必要です。 readStream を例にとると、コードは次のようになります。

const rs = fs.createReadStream("./package.json");
コンテンツ = "" とします。

rs.on("開く", () => {
    console.log("読み始める");
});

rs.on("データ", チャンク => {
    コンテンツ += chunk.toString("utf8");
});

rs.on("閉じる", () => {
    console.log("読み取り完了、コンテンツは:\n", content);
});

ストリーム パイプの助けを借りて、大きなファイルのコピー関数を 1 行に素早くカプセル化できます。

関数 copyBigFile(src, target) {
    fs.createReadStream(src).pipe(fs.createWriteStream(target));
}

以上がNodejsでモジュールfsファイルシステムを使用する方法の詳細です。Nodejsの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • node.js-fsファイルシステムモジュールはご存知のとおり
  • node.js で fs ファイルシステムモジュールを使用する詳細な例
  • node.jsファイルの詳細な説明 オペレーティングシステムの例
  • NodeJsファイルシステム操作モジュールfsの使い方を詳しく解説
  • Node のファイルシステムについてどれくらい知っていますか?

<<:  C# は MySQL コマンドラインのバックアップとリカバリを実装します

>>:  LinuxシステムのAnsible自動運用保守導入方法

推薦する

HTML テーブルタグチュートリアル (19): 行タグ

<TR> タグの属性は、次の表に示すように、テーブル内の各行のプロパティを設定するために...

Javascript での JSBridge に関する予備的研究

目次JSBridgeの起源JSBridgeの双方向通信原理JSはネイティブを呼び出すネイティブコール...

Linux システムによって報告される xfs_vm_releasepage 警告問題に対処する方法

問題の説明最近、いくつかのマシンで、一日のさまざまな時間に次の警告メッセージが表示されました。 3月...

dockerでマウントされたディレクトリが読み書きできない問題を解決する

次のコマンドを使用してコンテナを作成し、ローカルの /home/dock/Downloads ディレ...

Linux Centos7 に mysql8 をインストールするチュートリアル

1. RPMバージョンのインストールデータベースの他のバージョンがあるかどうかを確認し、ある場合は完...

HTML での非同期ファイルアップロードの例

コードをコピーコードは次のとおりです。 <form action="/hehe&qu...

vue3.0 でカルーセル コンポーネントをカプセル化する手順

目次1: カプセル化の考え方2. 包装工程3: ドットインジケーター4: 左と右のインジケーター5:...

Vue3 での provide と injection の使用

1. provideとinjectの説明Provide と Inject により、ネストされたコンポ...

webpack イメージを base64 に変換する例

url-loader をダウンロード 糸を追加 -D URLローダー モジュール: { ルール: {...

JavaScriptは双方向リンクリストプロセス分析を実装します

目次1. 二重連結リストとは何か2. 双方向リンクリストのカプセル化3. 双方向リンクリストの一般的...

js は、州、市、地区の 3 段階の選択カスケードを実装します。

この記事では、省、市、地区の3段階選択を実現するためのjsの具体的なコードを紹介します。具体的な内容...

after疑似要素を使用して中空の三角矢印とXアイコンを実装する例

フロントエンドのデザイン案では、「X」や「>」の形をした閉じるボタンや、他の 3 方向の白抜き...

Vue プロジェクトでよく使用されるツール機能の概要

目次序文1. カスタムフォーカスコマンド1. 方法1 2. 方法2 3. 方法3 2. 入力ボックス...

MySQL 8.0 Windows zip パッケージ版の詳細なインストール手順

MySQL 8.0 Windows zipのインストール手順は次のように紹介されています。準備する:...

Alibaba Cloud イメージリポジトリを使用して外部 Docker イメージを構築する方法の詳細な説明

Alibaba Cloud Image Repositoryを使用して外部イメージをダウンロードする...