Node.jsのfs組み込みモジュール

fs (File system、ファイルシステム) は、さまざまなオペレーティングシステム (Windows、macOS など) でファイルを操作するために使用できる、node の組み込みモジュールです。ノードの公式ドキュメントを確認すると、ファイル システムの下に多くの API があることがわかります。

ファイルの読み書きに使用されるもの、フォルダーの操作に使用されるものなど、いずれも3 つの動作モード (同期非同期Promise )を提供します。ここでは、説明のための例として、一般的に使用される API をいくつか示します。

操作ファイル

ファイルを読み取る

同期読み取り

fs.readFileSync()ファイルを同期的に読み取る (Sync) ために使用されます。直接読み取るファイルのパスまたはファイル記述子を渡すだけです。

// 代码块 1.1.1
const fs = require('fs')
// 同步读取
const resSync = fs.readFileSync('./test.txt')
console.log(resSync)
console.log('看看会不会阻塞') 

実行結果は次のとおりです。行 6 の出力は行 5 の後にあり、同期操作によって後続のコードの実行がブロックされることを示しています。

resSync結果はBuffer オブジェクトであり、本質的にはバイナリ コンテンツであり、16 進数で表示されます。テキストの内容を確認したい場合は、 を使用して結果を変換toString()するconsole.log(resSync.toString())か、 2 番目のパラメータを - 構成を指定するためのオプションのオブジェクトfs.readFileSync()に渡します。これには 2 つのプロパティがあります。

  • encoding、デフォルト値は ですnull。つまり、結果はバッファとして表示されます。テキストを表示したい場合は、それを'utf-8'(または'utf8') に変更できます。
  • flag、ファイルを読み取るときのデフォルト値'r'、フラグの詳細については、公式ドキュメントを参照してください。
// 代码块 1.1.2
const resSync = fs.readFileSync('./test.txt', {encoding: 'utf-8',flag: 'r'
})
console.log(resSync)
console.log('看看会不会阻塞') 

resSync表示されているのは文字列です:

非同期読み取り - コールバック

fs.readFile()ファイルを非同期に読み取るために使用されます。3 つのパラメーターを渡すことができます。最初の 2 つはfs.readFileSync()と同じで 3 番目のパラメーターは読み取り結果が取得されたときに呼び出されるコールバック関数です。

// 代码块 1.2.1
fs.readFile('./test.txt',{encoding: 'utf-8'},(err, data) => {if (!err) console.log(data)}
)
console.log('看看会不会阻塞') 

実行結果は次のとおりです。非同期読み取りによって後続のコードの実行がブロックされないことがわかります。

非同期読み取り - Promise

fs.promises.readFile()ファイルを非同期で読み取るためにも使用されますが、結果を取得するためにコールバック関数を使用するときに発生しやすいコールバック地獄を回避できます。

// 代码块 1.3.1
fs.promises.readFile('./test.txt', {encoding: 'utf-8'}).then(res => {console.log(res)}).catch(err => console.log(err)) 

ファイルに書き込む

fs.writeFile()ファイルの書き込みには同期メソッドと非同期メソッドもあり、以下では例として非同期コールバック API を使用します。最初のパラメータはファイルのアドレスまたはファイル記述子です。ファイルが存在しない場合は作成されます。2 番目のパラメータは書き込まれる内容です。3 番目のパラメータは、構成を指定するために使用されるオプションのオブジェクトです。これらは、encodingと のflagが、encodingここではデフォルト値 is です'utf8'つまり、デフォルトで書き込まれたコンテンツが元のコンテンツを上書きします。元のコンテンツに追加したい場合は、それを変更できます(追加)。 4 番目のパラメータはコールバック関数で、書き込み操作が完了した後に呼び出されます。書き込み中にエラーが発生した場合、エラー情報がパラメータとして渡されます。flag'w''a'

fs.writeFile('./test.txt','Hello Juejin',{encoding: 'utf8',flag: 'w'},err => {if (err) {console.log(err)return}console.log('写入成功')}
) 

ファイル記述子

前述したように、ファイルを読み取る 3 つの方法では、渡される最初のパラメーターは、ファイルのパスに加えて、ファイル記述子 (ファイル記述子) になることもあります。一般的なオペレーティング システムでは、カーネルはプロセスごとに現在開いているファイルとリソースのテーブルを維持し、各開いているファイルには、ファイルを識別して追跡するための単純な番号が割り当てられます。ただし、システムの特定の実装は異なる場合がありますが、ノードは違いを処理し、開いている各ファイルに数値タイプのファイル記述子を割り当てます。

ファイルをfs.open()開くこと。

// 代码块 2.1.1
fs.open('./test.txt', (err, fd) => {if (!err) {console.log(fd)}
}) 

型を見ると、その 2 番目のパラメータ、つまりコールバック関数が 2 つのパラメータで渡されることがわかります。1 つ目はエラー メッセージ、2 つ目はerrファイル記述子ですfd

得られた結果は 3 です。

ファイル情報を表示する

ファイル記述子を取得した後、fs.fstat()ファイル情報を表示できます (最初のパラメーターは fd のみです)。

fs.open('./test.txt', (err, fd) => {if (err) returnfs.fstat(fd, (err, stats) => {if (err) returnconsole.log(stats)fs.close(fd) // 关闭文件})
}) 

印刷結果は次のとおりです。

アクションフォルダー

フォルダーを作る

fs モジュールはフォルダーを操作することもできます。fs.mkdir()たとえばフォルダーを作成できます。また、mkdir は make directory の略語とみなすことができます。

fs.mkdir('./test', err => console.log(err)) // 创建 test 文件夹 

フォルダーを読み取る

fs.readdir()フォルダーの読み取りに使用でき、コールバック関数は読み取りフォルダーに含まれるファイルまたはフォルダーを返します。たとえば、ノード ディレクトリの構造は次の図に示されています。

次のコードを実行してノード ディレクトリを読み取ります。

// fs.js
fs.readdir('../node', (err, files) => {if (!err) console.log(files)
}) 

出力される結果は次のとおりです: [ 'fs.js', 'test', 'test.txt' ]。より詳細な情報を取得したい場合は、構成オブジェクトを渡して次のようにwithFileTypes設定true

fs.readdir('../node', { withFileTypes: true }, (err, files) => {if (!err) console.log(files)
}) 

次に、出力結果は の値Symbol(type)を、それがファイル (値1) であるかフォルダー (値2) であるかを示します。Symbol の導入については、Symbol の詳細な説明を参照してください。

まだ問題があり、テスト フォルダー内のindex.txt ファイルが読み取られていません。ノード ディレクトリ内のすべてのファイルを読みたい場合は、それを再帰的に読み取ることができます。

function readDirRecursive(path) {fs.readdir(path, { withFileTypes: true }, (err, files) => {if (err) returnfiles.forEach(item => {if (item.isDirectory()) {readDirRecursive(`${path}/${item.name}`)} else {console.log(item.name)}})})
}
readDirRecursive('../node') 

また、返される配列オブジェクトになり、それらがフォルダーであるかどうかを判断するプロパティとメソッドが存在するように、 にwithFileTypes設定する必要があります。truefilesnameisDirectory()

フォルダー/ファイルの名前を変更する

fs.rename()フォルダーまたはファイルの名前は変更できます。最初のパラメーターは古い名前で、2 番目のパラメーターは新しい名前を渡すことができます。

fs.rename('./test', './juejin', err => console.log(err)) 

やっと

最近ではJavaScriptとESのノート、合計25個の重要な知識を整理し、それぞれの知識を解説・分析しました。JavaScriptとESの関連知識を素早く習得し、作業効率を向上させることができます。



困っている友達は、下のカードをクリックして無料で受け取って共有できます

おすすめ

転載: blog.csdn.net/Android_boom/article/details/129878924