目次
Node.js 用の fs モジュール (fs API)
fs: ファイル システム ファイル システム
fs モジュールは、ハードディスクと対話できます。たとえば、ファイルの作成、削除、名前変更、移動、ファイル内容の書き込みや読み取り、フォルダー関連の操作などです。
1.ファイルに書き込む
方法 | 説明する |
---|---|
ファイルの書き込み | 非同期書き込み |
writeFileSync | 同期書き込み |
appendFile /appendFileSync | 追加書き込み |
作成書き込みストリーム | ストリーミングライティング |
//文件名:nodejs-fs/code/1-文件写入.js
/** 文件写入需求:
* 新建一个文件,座右铭.txt,写入内容:三人行,则必有我师焉。
*/
// 1.导入fs模块
const fs = require('fs'); //require 是 Node.js 环境中的全局函数,用于导入模块
//2.写入文件
fs.writeFile('./座右铭.txt','三人行,则必有我师焉。', err => {
//写入失败时,回调函数调用时,会传入错误对象;写入成功,会传入null
if(err){
console.log('写入失败');
return;
}
console.log('写入成功');
});
1.1 writeFileの非同期書き込み
構文: fs.writeFile(file, data[, options], callback)
パラメータの説明:
- ファイル ファイル名
- データ 書き込まれるデータ
- オプション オプション設定(オプション)
- コールバック書き込みコールバック
戻り値:未定義
1.2 writeFileSync同期書き込み
1.3 appendFile /appendFileSync 追加書き込み
//文件名:nodejs-fs/code/2-追加写入.js
const fs = require('fs'); //导入fs模块
//3.追加写入
fs.appendFile('./座右铭.txt','择其善者而从之,择其不善者而改之', err => {
if(err){
console.log('写入失败');
return;
}
console.log('追加写入成功');
});
fs.appendFileSync('./座右铭.txt','\r\n 温故而知新,可以为师矣。');
// writeFile 实现追加写入
fs.writeFile('./座右铭.txt','one two',{
flag: 'a'}, err => {
//写入失败时,回调函数调用时,会传入错误对象;写入成功,会传入null
if(err){
console.log('写入失败');
return;
}
console.log('写入成功');
});
1.4 createWriteStream ストリーミング書き込み
構文: fs.createWriteStream (path[, options])
パラメータの説明:
- パス ファイルのパス
- オプション オプション設定(オプション)
戻り値:オブジェクト
//文件名:nodejs-fs/code/3-流式写入.js
const fs = require('fs'); //导入fs模块
//4. createWriteStream 流式写入
const ws = fs.createWriteStream('./观书有感.txt');
//write
ws.write('一去二三里\r\n');
ws.write('烟村四五家\r\n');
ws.write('亭台六七座\r\n');
ws.write('八九十之花\r\n');
//关闭通道
ws.close(); //可不加这一句
1.5 ファイル書き込みアプリケーションのシナリオ
データを永続化する必要がある場合は、ファイルへの書き込みを考慮する必要があります。
ファイルの書き込みはコンピュータで非常に一般的な操作です。ファイルの書き込みは次のシナリオで使用されます。
- ダウンロードファイル
- ソフトウェアをインストールする
- Git などのプログラム ログを保存する
- エディターの保存ファイル
2. ファイルの読み込み
ファイル読み込み:プログラムを通じてファイルからデータを取得することであり、以下の方法が使用できます。
方法 | 説明する |
---|---|
ファイルの読み取り | 非同期読み取り |
readFileSync | 同期読み取り |
作成読み取りストリーム | ストリーミング読み取り |
2.1 readFileの非同期読み取り
構文: fs.readFile (path[, options],callback)
パラメータの説明:
- パス ファイルのパス
- オプション オプション設定(オプション)
- callback コールバック関数
戻り値: 未定義
//文件名:nodejs-fs/code/4-文件读取.js
const fs = require('fs'); //导入fs模块
//2.1 readFile 异步读取
fs.readFile('./观书有感.txt', (err,data) => {
if(err) throw err;
console.log(data);
console.log(data.toString());
});
2.2 readFileSync 同期読み取り
//文件名:nodejs-fs/code/4-文件读取.js
const fs = require('fs'); //导入fs模块
//2.2 readFileSync 同步读取
let data = fs.readFileSync('./观书有感.txt');
console.log(data);
console.log(data.toString());
2.3 createReadStream ストリーミング読み取り
//文件名:nodejs-fs/code/5-流式读取.js
const fs = require('fs'); //导入fs模块
//2.3 createReadStream 流式读取
//创建读取流对象
const rs = fs.createReadStream('爱你.mp4');
//绑定 data 事件; chunk 块儿
rs.on('data',chunk => {
console.log(chunk);
console.log(chunk.length); //65536 字节 => 64 KB
})
// end 事件 可选
rs.on('end',() => {
console.log('读取完成');
})
2.4 ファイル読み取りアプリケーションのシナリオ
- コンピューターが起動します
- プログラムの実行中
- エディターがファイルを開く
- 写真を見る
- 動画を再生します
- 音楽を再生
- Git ビューのログ
- ファイルをアップロードする
- チャット履歴を表示する
3. ファイルのコピー、名前変更、移動
ファイルのコピー:
//文件名:nodejs-fs/code/6-文件复制.js
/** 文件复制需求:
* 复制 【爱你.mp4】
*/
const fs = require('fs'); //导入fs模块
//process是Node.js内置模块;memoryUsage是process的一个方法,获取内存占用量
const process = require('process');
//方式一 readFile
let data = fs.readFileSync('./爱你.mp4'); //读取文件内容
fs.writeFileSync('./资料/爱你.mp4', data); //写入文件
console.log(process.memoryUsage()); //rss:50020352 字节
/**
{
rss: 50020352,
heapTotal: 6438912,
heapUsed: 5848504,
external: 20551626,
arrayBuffers: 20120219
}
*/
//方式二 流式操作 【该方式更好,所占资源少】
const rs = fs.createReadStream('./爱你.mp4'); //创建读取流对象
const ws = fs.createWriteStream('./资料/爱你1.mp4'); //创建写入流对象
//绑定 data 事件
rs.on('data',chunk => {
ws.write(chunk);
});
rs.on('end',() => {
console.log(process.memoryUsage()); //rss: 43552768 字节
});
//方式三 流式操作 【该方式用的不多】
const rs = fs.createReadStream('./爱你.mp4'); //创建读取流对象
const ws = fs.createWriteStream('./资料/爱你2.mp4'); //创建写入流对象
rs.pipe(ws);
ファイルの名前変更と移動:
//文件名:nodejs-fs/code/7-文件重命名与移动.js
/** 文件重命名需求:
* 座右铭.txt 重命名为 论语.txt
*/
const fs = require('fs'); //导入fs模块
//调用 rename 方法 进行文件重命名
fs.rename('./座右铭.txt','./论语.txt', err => {
if(err){
console.log('操作失败');
return;
}
console.log('操作成功');
});
//文件的移动
fs.rename('./遇见.mp3','./资料/遇见.mp3', err => {
if(err){
console.log('操作失败');
return;
}
console.log('操作成功');
});
4.ファイルの削除
Node.js では、unlink、unlinkSync、rm、rmSync を使用してファイルを削除できます。
構文:
fs.unlink(path,callback)
fs.unlinkSync(path)
fs.rm(path,callback)
fs.rmSync(path)
パラメーター説明:
- パス ファイルのパス
- callback コールバック関数
//文件名:nodejs-fs/code/8-删除文件.js
const fs = require('fs'); //导入fs模块
// 调用 unlink 方法 unlinkSync
fs.unlink('./资料/爱你.mp4', err => {
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
fs.unlinkSync('./爱你.mp4');
// 调用 rm 方法 Node.js的14.4版本引入 rmSync
fs.rm('./资料/爱你2.mp4', err => {
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
fs.rmSync('./资料/爱你1.mp4');
5. フォルダーの操作
Node.js 機能を利用して、ファイルの作成、読み取り、削除などの操作を行うことができます。
方法 | 説明する | 文法 |
---|---|---|
mkdir | フォルダーを作る | mkdir(パス[, オプション],コールバック) |
mkdirSync | フォルダーを作る | mkdirSync(パス[, オプション]) |
読み取り | フォルダーの読み取り | readdir(パス[, オプション],コールバック) |
readdirSync | フォルダーの読み取り | readdirSync(パス[, オプション]) |
rmです | フォルダを削除する | rmdir(パス[, オプション],コールバック) |
rmdirSync | フォルダを削除する | rmdirSync(パス[, オプション]) |
//文件名:nodejs-fs/code/9-文件夹操作.js
const fs = require('fs'); //导入fs模块
//创建文件夹; mk make 制作;dir directory 文件夹
fs.mkdir('./html', err => {
if(err){
console.log('创建失败');
return;
}
console.log('创建成功');
});
//递归创建文件夹
fs.mkdir('./a/b/c',{
recursive: true}, err => {
if(err){
console.log('创建失败');
return;
}
console.log('创建成功');
});
//读取文件夹
fs.readdir('./资料', (err,data) => {
if(err){
console.log('读取失败');
return;
}
console.log(data);
}); //结果为 [ '爱你1.mp4', '爱你2.mp4', '遇见.mp3' ]
//删除文件夹 rm remove 移除
fs.rmdir('./html', err => {
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
//递归删除文件夹 【不推荐使用】
fs.rmdir('./a',{
recursive: true}, err => {
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
//递归删除文件夹 【推荐使用】
fs.rm('./a',{
recursive: true}, err => {
if(err){
console.log('删除失败');
return;
}
console.log('删除成功');
});
6. リソースのステータスを確認する
Node.js では、stat と statSync を使用してリソースの詳細を表示できます。
構文:
fs.stat (パス[, オプション],コールバック)
fs.statSync (パス[, オプション])
//文件名:nodejs-fs/code/10-查看资源信息.js
const fs = require('fs'); //导入fs模块
// stat 方法 status 缩写 状态
fs.stat('./资料/爱你1.mp4', (err,data) => {
if(err){
console.log('操作失败');
return;
}
console.log(data);
console.log(data.isFile()); //isFile检测是否为文件
console.log(data.isDirectory()); //isDirectory检测是否为文件夹
});
/*结果如下:
Stats {
dev: 177919585,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 1125899907180791,
size: 20102613, //文件大小
blocks: 39264,
atimeMs: 1685517209138.5369,
mtimeMs: 1685517209138.5369,
ctimeMs: 1685517209138.5369,
birthtimeMs: 1685516572800.8633,
atime: 2023-05-31T07:13:29.139Z,
mtime: 2023-05-31T07:13:29.139Z, //最后修改时间
ctime: 2023-05-31T07:13:29.139Z,
birthtime: 2023-05-31T07:02:52.801Z //创建时间
}
true
false
*/
7. 相対パスの問題
fs モジュールがリソースを操作する場合、パスを記述する方法は 2 つあります。
相対パス:
- ./motto.txt: 現在のディレクトリにあるotto.txt
- Motto.txt:上記の記述に相当
- . ./motto.txt: 現在のディレクトリの 1 つ上のディレクトリにある motto.txt
絶対パス:
- D:/Program Files: Windows システムの絶対パス
- /usr/bin: Linux システムでの絶対パス
相対パスのいわゆるカレント ディレクトリは、ファイルが配置されているディレクトリではなく、コマンド ラインの作業ディレクトリを参照します。
したがって、コマンド ラインの作業ディレクトリがファイルが配置されているディレクトリと一致しない場合、いくつかのBUGが発生する可能性があります。
8._ _dirame [相対パスのバグと解決策]
//文件名:nodejs-fs/code/12-相对路径的BUG.js
const fs = require('fs');
//相对路径参照物:命令行的工作目录
fs.writeFileSync('./index.html','love');
//绝对路径 ‘全局变量’保存的是:所在文件的所在目录的绝对路径
console.log(__dirname);
fs.writeFileSync(__dirname + '/index.html','love');
9. 演習: 名前の一括変更
//文件名:nodejs-fs/1-重命名.js
const fs = require('fs');
//读取 code 文件夹
const files = fs.readdirSync('./code');
console.log(files);
//遍历数组
files.forEach(item => {
// 拆分文件名
let data = item.split('-');
let [num, name] = data;
//判断
if(Number(num) < 10){
num = '0' + num;
}
//创建新的文件名
let newName = num + '-' + name;
//重命名
fs.renameSync(`./code/${
item}`, `./code/${
newName}`);
});