1. コンテンツをテキスト ファイルに書き込む
Node.js ファイル システム (fs モジュール) モジュールのメソッドには、非同期バージョンと同期バージョンがあります. たとえば、ファイル コンテンツを読み取る関数には、非同期の fs.readFile() と同期の fs.readFileSync() があります。
非同期メソッド関数の最後のパラメーターはコールバック関数であり、コールバック関数の最初のパラメーターにはエラー メッセージ (エラー) が含まれます。
非同期メソッドを使用することをお勧めします。非同期メソッドは、同期メソッドと比較して、パフォーマンスが高く、速度が速く、ブロッキングがありません。
モジュールをインポートし、writeFileメソッドを使用します ———非同期書き込み
writeFile は 次の 3 つのパラメーターを受け取ります。
ファイルパス: 文字列
コンテンツ: 文字列
コールバック関数: function(err){ }、err は書き込みエラー
~ writeFileSyncメソッドを使用する———同期書き込み
writeFileSync は 、次の 2 つのパラメーターを受け取ります。
ファイルパス: 文字列
コンテンツ: 文字列
〜ストリーム書き込み
1.ストリーミング書き込みインスタンスを作成し、パスをパラメーターとして渡します
2. const ins = fs.createWriteStream(ファイルパス)
3. ins.write( content )経由で書き込みます
4. 閉じる: ins.close()
~ 追加内容
1. 同期追加: fs.appendFileSync( file path , content )経由
2. 非同期追加: fs.writeFile関数の 4 番目のパラメーターを介して (コードを参照)
コードは以下のように表示されます:
const fs = require("fs"); // 导入 file system 模块
// 异步写入文件
fs.writeFile("./files/01.txt", "被异步写入的内容", (err) => {
if (err) {
console.log(err.message); // 输出错误信息
return;
} else {
console.log("成功写入文件./files/01.text");
}
});
// 同步写入文件
fs.writeFileSync("./files/02.txt", "被同步写入的内容");
// 流式写入 fs.createWriteScream
const ws = fs.createWriteStream("./files/03.txt"); // 创建流式写入实例,传入路径为参数
ws.write("鹅鹅鹅\r\n"); // 写入
ws.write("曲项向天歌\r\n");
ws.write("白毛浮绿水\r\n");
ws.write("红掌拨清波\r\n");
ws.close(); // 关闭流
// 异步追加写入 \r\n 表示换行
fs.appendFile("./files/01.txt", "\r\n这是在01.txt文件内追加的内容", (err) => {
if (err) {
console.log("追加失败!");
} else {
console.log("追加成功!");
}
});
// 同步追加
fs.appendFileSync("./files/02.txt", "\r\n这是在02.txt文件内同步追加的内容");
// 使用fs.writeFile 实现异步追加写入
fs.writeFile(
"./files/01.txt",
"\r\n被使用fs.writeFile写入的内容",
{ flag: "a" },
(err) => {
if (err) {
console.log(err.message); // 输出错误信息
return;
} else {
console.log("成功写入文件./files/01.text");
}
}
);
2.テキストファイルからコンテンツを読み取る
~ 非同期読み取りreadFile :
fs.readFile(ファイルパス、コールバック関数)
コールバック関数: parameter*2 (err, data), data は読み込み内容
読み取り内容: 読み取り形式は buffer、buffer.toString は utf-8 文字に変換されます
~同期読み取りreadFileSync : 1 つのパス パラメータのみが受信され、値は変数/定数によって受信されます
~ ストリーミング ReadStream:
1. const ins = fs.createReadStream(ファイルパス)
2. ins . on (「データ」、コールバック関数)
コールバック関数: 読み取りブロック チャンク パラメータを受け取る
3.ins.close ( コールバック関数)
コードは以下のように表示されます:
const fs = require("fs");
// 异步读取
fs.readFile("./files/03.txt", (err, data) => {
if (err) {
console.log(err.message);
} else {
console.log(data.toString()); // buffer.toString 转为utf-8 字符
}
});
// 同步读取 readFileSync
const date2 = fs.readFileSync("./files/03.txt");
console.log(date2.toString());
/**
* 流式读取
*/
const rs = fs.createReadStream("./files/img1.jpg");
// 读取
rs.on("data", (chunk) => {
console.log(chunk.length);
});
// 结束
rs.close(() => {
console.log("读取结束");
});
3. 経路問題、経路モジュール
絶対パスと相対パスの問題、nodeが実行する端末ディレクトリを上位ディレクトリに変更するとエラーになるので、絶対パス__dirnameを使うか、パスモジュールを使うことを推奨
コードは以下のように表示されます:
/**
* 绝对路径和相对路径的问题
*/
const fs = require("fs");
// 相对路径
fs.writeFileSync("./index.html", "index"); // 在当前文件同级目录下新建文件
/**
* 如果把node执行的终端目录修改至上级目录,就会出现错误
* Error: Cannot find module '/Users/jiangchuanyou/Desktop/node/path.js'
*/
// 建议使用绝对路径 __dirname
console.log(__dirname); // Users/jiangchuanyou/Desktop/node/fs
// 使用绝对路径拼接相对的路径
fs.writeFileSync(__dirname + "/index.html", "拼接路径"); // 无需加符号:.
// 建议使用 path 模块
const path = require("path");
fs.writeFileSync(path.join(__dirname, "/index.html"), "path模块");
4. ファイル情報を読む
fs.stat ファイルのリソース情報を表示
リソース情報は、コールバック関数の 2 番目のパラメーター情報です。
一般的にフォルダかファイルかを判断する必要があり、info.isFile()関数でファイルかどうか、info.isDirectory()関数でフォルダかどうかを判断します。
コードは以下のように表示されます:
/**
* 查看文件资源信息
*/
const fs = require("fs");
fs.stat("./files/img1.jpg", (err, info) => {
if (err) {
console.log(err.message);
} else {
console.log(info); // 文件信息 dev: 16777234,
// 判断是否为文件夹
console.log(info.isFile()); // 是,返回true
console.log(info.isDirectory()); // 不是,返回false
}
});
5.フォルダ操作
フォルダー操作: 作成、名前変更、読み取り
通常の作成: fs.mkdir()
再帰的な作成: { recursive: true }を構成して再帰を実現します
fs.readdir()フォルダーの読み取り: 2 番目のパラメーターでデータを読み取ります
サブフォルダーを含むフォルダーの再帰的な強制削除を追加しました: fs.rm(path, { recursive: true, force: true } )
コードは以下のように表示されます:
/**
* 文件夹操作:创建、重命名、读取
*/
const fs = require("fs");
// 创建
fs.mkdir("./files_03", (err) => {
if (err) {
console.log(err.message);
} else {
console.log("创建成功");
}
});
// 递归创建 配置{ recursive: true }实现递归
fs.mkdir("./files_04/子文件夹1/子文件夹二", { recursive: true }, (err) => {
if (err) {
console.log(err.message);
} else {
console.log("递归创建成功");
}
});
// 读取文件夹,读取的数据在第二个型参
fs.readdir("./files", (err, files) => {
if (err) {
console.log(err.message);
} else {
console.log(files); // 读取结果
}
});
// 删除
fs.rmdir("./files/要被删除的", (err) => {
if (err) {
console.log(err.message);
} else {
console.log("删除成功");
}
});
// 递归删除
fs.rmdir("./files/files_05", (err) => {
if (err) {
console.log(err.message); // 报错:directory not empty, rmdir './files/files_05'
} else {
console.log("删除成功");
}
});
// 一般不让删除有子文件夹的文件夹
// 添加递归强制删除:fs.rm(path, { recursive: true, force: true })
fs.rmdir("./files/files_05", { recursive: true, force: true }, (err) => {
if (err) {
console.log(err.message); // 报错:directory not empty, rmdir './files/files_05'
} else {
console.log("删除成功");
}
});
6. ファイルを削除する
コードは以下のように表示されます:
/**
* 删除文件
*/
const fs = require("fs");
// 方法一
fs.rm("./files/files_02/垃圾文件1", (err) => {
if (err) {
console.log(err.message);
} else {
console.log("删除成功");
}
}); // fs.rm 在 node 14.4 版本以上支持
// 方法二
fs.unlink("./files/files_02/垃圾文件2", (err) => {
if (err) {
console.log(err.message);
} else {
console.log("删除成功");
}
});
7. ファイルをコピーする
最初の方法: ストリーミング レプリケーション、読み取り中のコピーがより効率的
* 2 番目の方法: 最初に読み取り、次にコピー、低効率
/**
* 案例:
* 复制文件,
* 第一种方式:流式复制,边读取边复制效率更高
* 第二种方式:先读取,再复制,效率低
* ps: process.memoryUsage() 查看内存使用
*/
const fs = require("fs");
/**
* 方法一
*/
// 1.读取流
const rs = fs.createReadStream("./files/img1.jpg");
// 2.写入流
const ws = fs.createWriteStream("./files/img2.jpg");
// 3.读取
rs.on("data", (chunk) => {
// 4.把读取到的内容,同时写入
ws.write(chunk, (err) => {
if (err) {
console.log("写入错误" + err.message);
}
});
});
// 5.结束
rs.on("end", () => {
console.log("读取结束\r\n方法一使用内存如下");
console.log(process.memoryUsage());
});
/**
* 方法二
*/
const data2 = fs.readFileSync("./files/img1.jpg"); // 得到读取的数据
// 把读取的数据写入
fs.writeFile("./files/img3.jpg", data2, (err) => {
if (err) {
console.log(err.message);
} else {
console.log("方法二内存使用:\r\n");
console.log(process.memoryUsage());
}
});
8.ファイルパスとファイル名の変更、バッチリネーム
fs.rename ファイルパスとファイル名の変更、一括リネーム
小さなケース:
要件: 1. あなたは誰ですか.text -> 1_あなたは誰ですか.txt
/**
* fs.rename 更改文件路径,和文件名,批量重命名
**/
const fs = require("fs");
// 重命名
fs.rename("./files/03.txt", "./files/一首诗.txt", (err) => {
if (err) {
console.log(err.message);
} else {
console.log("重命名成功");
}
});
// 移动
fs.rename("./files/一首诗.txt", "./files/files_02/移动了这首诗.txt", (err) => {
if (err) {
console.log(err.message);
} else {
console.log("移动成功");
}
});
/**
* 批量重命名
* 需求:1.你是谁.text -> 1_你是谁.txt
*/
// 读取文件夹内容
const innerFiles = fs.readdirSync("./files_03");
// 输出一个数组
console.log(innerFiles); // [ '1.你是谁.txt', '2.事实上.txt', '3.宿舍.txt' ]
// 分离数字和中文
const newFiles = innerFiles.forEach((item) => {
const data = item.split("."); // 分割 :[ '1', '你是谁', 'txt' ]
let [number, text, ext] = data; // 获取数字和文字
// 数字小于10,在前面添加 0
if (number < 10) {
number = 0 + number;
}
// 合并
const newName = number + "_" + text + "." + ext;
// 写入
fs.renameSync(`./files_03/${item}`, newName);
});