fsモジュールは、Node.js のファイル システム操作用の組み込みモジュールであり、ファイルとディレクトリを処理するためのさまざまなメソッドと関数を提供します。
目次
1. ファイルに書き込む
通常の書き込み方法:
fs モジュールの fs.writeFile() と fs.writeFileSync() が使用されます,其中前者是异步方法,后者是同步方法。
语法格式:下面的代码执行会找到对应的文件写入str字符串,如果没有该文件,则会自动创建文件并写入,但是这种写入会将原来的文件直接覆盖掉。
异步方法:
const fs = require('fs')
let str = 'hello'
//会直接覆盖写入,如果没有文件夹会自动创建新的文件夹
fs.writeFile('1.txt', str, (err) => {
if (err) {
console.log(err)
return
}
console.log('写入成功1')
})
同期方法:
同期メソッドにはエラー コールバック関数がないため、ここでは手動でエラーを受け取る必要があります。
const fs = require('fs')
try {
fs.writeFileSync('1.txt', '11223344')
console.log('文件写入成功')
} catch (error) {
console.error('文件写入失败:', error)
}
ストリーミング書き込み:
const fs = require('fs')
let ws = fs.createWriteStream('1.txt')
ws.write('111\n')
ws.write('222\n')
ws.close()
ストリーミング書き込みと通常の書き込みの違い:
-
書き込み方法: ファイルを書き込む一般的な方法は、書き込むデータを一度にメモリにロードし、データ ブロック全体をファイルに書き込むことです。ストリーム書き込み方式では、データを徐々にファイルに書き込み、一度に書き込むデータのほんの一部のみを作成します。
-
メモリ使用量: ファイルを書き込む一般的な方法では、データを書き込む前にすべてのデータをメモリにロードする必要があるため、大量のデータを書き込む場合、より多くのメモリを使用する可能性があります。ただし、ストリーム書き込み方式はデータを段階的に書き込み、メモリに格納するデータの一部だけを必要とするため、メモリの占有量が少なくなります。
-
スケーラビリティ: 通常のファイル書き込み方法は少量のデータの書き込みに適していますが、ストリーミング ファイル書き込み方法は大量のデータまたはリアルタイム書き込みのシナリオに適しています。ストリーミング書き込みは、データをリアルタイムでファイルに書き込むことができ、大きなファイルの処理や、ロガーやリアルタイム データ ストリームなどの連続書き込みが必要な状況の処理に適しています。
-
パフォーマンスと効率: ファイルを書き込む一般的な方法では、すべてのデータを一度に書き込む必要があるため、大量のデータを書き込むときに長い待ち時間がかかることがあります。ストリーム書き込み方式は、データ ストリームを段階的に書き込むことでリアルタイムの書き込みを実現し、大量のデータを処理する場合のパフォーマンスと効率が向上します。
要約すると、ファイルに書き込む通常の方法は少量のデータを 1 回だけ書き込む場合に適しており、ファイルにストリーミングする方法は大量のデータを処理または書き込む必要がある状況に適しています。リアルタイムで。ファイルへのストリーミング書き込みにより、パフォーマンスとスケーラビリティが向上し、データ量が多い場合に消費するメモリが少なくなります。
2. 同期と非同期について話す
実際に上記の記述方法の一方は同期、もう一方は非同期であることがわかりますが、両者の違いは何でしょうか、またどのような場合に使用すればよいのでしょうか?
実装プロセス:
js コードの実行フローは上から下に順番に実行されることを皆さんも認識してください。これは同期の場合も同様です。順番に実行されます。つまり、同期メソッドを呼び出すと、プログラムはそのメソッドを待ちます。実行を続行する前に完了するステートメント。一方、非同期メソッドはノンブロッキングで、操作の完了を待たずにすぐに戻ります。非同期メソッドは通常、コールバック関数を受け入れるか、Promise オブジェクトを返します。操作が完了すると、結果はコールバック関数または Promise 処理メカニズムを通じて処理されます。
次のコード例で実行フローを確認できます。
const fs = require('fs')
let str = 'hello'
//会直接覆盖写入,如果没有文件夹会自动创建新的文件夹
fs.writeFile('1.txt', str, (err) => {
if (err) {
console.log(err)
return
}
console.log('异步写入成功')
})
try {
fs.writeFileSync('1.txt', '11223344')
console.log('同步写入成功')
} catch (error) {
console.error('文件写入失败:', error)
}
console.log('全部代码执行完毕')
以下のコードは同期書き込みが完了してから実行され、非同期メソッドは最後に実行されるため、コード全体の実行処理には影響を与えないことがわかります。私たちが書くコードは非常に大きく、同期メソッドを使用すると一時的にコードがブロックされてしまいますが、非同期メソッドではそのような問題は発生しません。
このことから、特に単純なスクリプトや処理ロジックが比較的単純なプログラムでは、同期方式の方が便利で直感的であると結論付けることができますが、大きなファイルを扱う場合は、非同期方式を使用することをお勧めします。
3. 追加書き込み
非同期メソッド:
以前に書き込んだファイルは上書きされて書き込まれます。実行後、以前のファイルは上書きされます。追加書き込みを実装するには、次のメソッドが必要です。\r\n は改行を意味します
const fs = require('fs')
fs.appendFile('1.txt', '\r\n111', (err) => {
if (err) {
console.log(err)
return
}
console.log('追加成功')
})
同期方法:
try {
fs.appendFileSync('1.txt', '\r\n222')
console.log('同步追加成功')
} catch (error) {
console.error('文件写入失败:', error)
}
4. ファイルを読み取ります
ファイルの読み取りも同期および非同期です
const fs = require('fs')
//异步读取
fs.readFile('./1.txt', (err, data) => {
if (err) {
console.log(err)
return
}
console.log(data.toString())
})
//同步读取
let data = fs.readFileSync('./1.txt', 'utf-8')
console.log(data.toString())
ストリーミング読み取り:
const fs = require('fs')
let rs = fs.createReadStream('./1.txt')
rs.on('data', (chunk) => {
console.log(chunk.toString())
})
rs.on('end', () => {
console.log('读取完成')
})
rs.on('error', (err) => {
console.log(err)
})
ストリーミング読み取りと通常の読み取り方法の最も大きな違いは、やはり速度の問題です。
5. ファイルの名前変更とファイルの移動
ファイル名の変更
const fs = require('fs')
fs.rename('./1.txt', './修改.txt', (err) => {
if (err) {
console.log(err)
return
}
console.log('重命名成功')
})
ファイルの移動
実際には、位置を移動するために名前を変更する方法が使用されます
fs.rename('./修改.txt', '../test/1.txt', (err) => {
if (err) {
console.log(err)
return
}
console.log('重命名成功')
})
6. ファイルの削除
どちらの方法も利用可能です
const fs = require('fs')
fs.unlink('./2.txt', (err) => {
if (err) {
console.log(err)
return
}
console.log('删除成功')
})
fs.rm('./1.txt', (err) => {
if (err) {
console.log(err)
return
}
console.log('删除成功')
})
7. フォルダー操作
フォルダーを作る
const fs = require('fs')
fs.mkdir('./html', (err) => {
if (err) {
console.log(err)
return
}
console.log('创建成功')
})
再帰的に作成する、つまり多層構造のフォルダーを作成する
const fs = require('fs')
//递归创建
fs.mkdir('./a/b/c', { recursive: true }, (err) => {
if (err) {
console.log(err)
return
}
console.log('创建成功')
})
フォルダーディレクトリの内容を読み取ります
const fs = require('fs')
//读取文件夹
fs.readdir('../fs模块', (err, files) => {
if (err) {
console.log(err)
return
}
console.log(files)
})
演算結果
フォルダーの削除 (単一レベルのフォルダーのみ削除可能)
//删除文件夹
fs.rmdir('./html', (err) => {
if (err) {
console.log(err)
return
}
console.log('删除成功')
})
複数レベル構造のフォルダーを再帰的に削除する
const fs = require('fs')
//递归删除 官方不建议使用此方法,未来会被删除
fs.rmdir('./html', { recursive: true }, (err) => {
if (err) {
console.log(err)
return
}
console.log('删除成功')
})
//官方建议删除方法
fs.rm('./a', { recursive: true }, (err) => {
if (err) {
console.log(err)
return
}
console.log('删除成功')
})