ディレクトリ
One。Fsファイルモジュール
Nodejsはサーバー側プログラムであり、ファイルの読み取りと書き込みの機能を備えている必要がありますが、これらの機能はネイティブのjsでは使用できません.nodeでは、そのような機能を完了したい場合は、ノードのファイルシステム(fs)モジュールとfsモジュールを使用する必要があります。ファイル操作のすべての機能を提供します。
JavaScriptは、ブラウザー側でI / O操作を実行できません。これは、クライアントのセキュリティを保護するためです。ノードの組み込みモジュールfsモジュールを使用すると、実行時にJavaScriptがサーバー上のリソースファイルを操作できます。入出力操作能力
1.ファイルを読む
ファイルを読み取る方法には、同期読み取りと非同期読み取りがあります。
1.1非同期読み取り
fs.rendFile(文件路径, 回调函数)
const fs = require('fs');
fs.readFile('./1.txt',function(err,data) {
console.log(arguments)
})
実際のパラメータリストを出力することで、次のことがわかります。
ファイルが正常に読み取られた場合、コールバック関数は2つのパラメーターを受け入れます。
最初の引数はエラー、値はnull、2番目の引数は読み取ったデータです
ファイルの読み取りが成功した場合、最初のパラメーターの値はnullで、ブール値に変換された値はfalseです。
data.toStringでデータを表示する必要がある場合、dataはバッファデータストリームです。
テキストファイルを読む
//创建服务器
const server = http.createServer (function (req,res) {
//设置响应头
res.writeHead(200,{'Content-Type': 'text/html;charset=UTF-8' });
//读取文本文件
fs.readFile('./1.txt',function (err,data) {
//如果文件读取失败,返回错误原因
if(err) {
console.log(err);
return;
}
//文件读取成功,显示数据
res.end(data.toString());
})
})
//监听服务器端口
server.listen(3000);
console.log('server start at 3000');
localhostの3000ポートにアクセスすると、1.txtのコンテンツがすでにブラウザーページにあることがわかります。
外部テキストファイルを読み取る
//创建服务器模块
const http = require('http');
//创建文件读取模块
const fs = require('fs');
//尝试读取外部的文件
//创建服务器
const server = http.createServer (function (req,res) {
//设置响应头
res.writeHead(200,{'Content-Type': 'text/html;charset=UTF-8' });
//读取文本文件
fs.readFile('./public/public.txt',function (err,data) {
//如果文件读取失败,返回错误原因
if(err) {
console.log(err);
return;
}
//文件读取成功,显示数据
res.end(data.toString());
})
})
//监听服务器端口
server.listen(3000);
console.log('server start at 3000');
現在、ルーティングはありません。どのパスでも最初にこのページにアクセスします
1.2ファイルを同期的に読み取る
ファイルの同期読み取りでは、コピーによってデータが返されます。ほとんどすべてのfs関数には同期バージョンがあります。関数のバージョンの後にのみSyncを追加する必要があります
fs.readFileSync(文件路径)
const fs = require('fs');
const data = fs.readFileSync('./1.txt');
console.log(data);
console.log(data.toString())
印刷結果から、読み取ったデータもデータストリームの形式であることがわかります。data.toStringを介してデータを表示する必要がある場合。
ファイルの読み取りに非常に重大な問題があります。ファイルの読み取りに失敗すると、プログラムが直接クラッシュします。これが最後に確認する結果なので、エラーを自分でキャッチしてからエラーを処理する必要がありますプログラムをクラッシュさせないでください。
try {
const fs = require('fs');
const data = fs.readFileSync('./2.txt');
console.log(data.toString());
}catch (e) {
console.log('读取文件出现错误')
}
1.3ストリーミングの読み取り
ハードディスクからデータのセクションを読み取り、コールバック関数をトリガーします。つまり、データのセクションを読み取ってデータのセクションを処理し、大きなファイル操作を実現します。
2.ファイルに書き込む
ファイルを書き込むための同期および非同期のビーム書き込み方法もあります
2.1ファイルを非同期で書き込む
fs.writeFile('文件名','数据',function(err){ /* 数据写入失败时的回调函数*/ })
writeFileは上書きされることに注意してください
//引入fs模块
const fs = require('fs');
//异步写入
let data = "红红火火恍恍惚惚";
fs.writeFile('./write1.txt',data,function (err) {
// console.log(arguments);
// 回调函数只接受一个参数,写入成功返回null, 写入失败返回对象
if(err) {
console.log('数据写入失败');
}else {
console.log('数据写入成功');
}
})
私は事前にwrite1.txtを作成していません。このコードを実行すると、彼は自動的に私のフォルダーにwrite1.txtを作成します。
2.2ファイルを同期的に書き込む
fs.writeFileSync(文件路径, 数据)
ファイルを書き込む
let data = '普普通通娉娉袅袅';
fs.writeFileSync('./write2.txt',data);
console.log('文件写入成功');
ファイルの読み取りと同様に、プログラムがクラッシュしないようにエラーをキャッチする必要があります。
let data = '普普通通娉娉袅袅';
try {
fs.writeFileSync('./write2.txt',dat);
console.log('文件写入成功');
}catch (e) {
console.log('文件写入失败');
}
3.追記
3.1非同期追加
fs.appendFile(文件路径, 数据, 回调函数)
//引入fS模块
const fs = require('fs');
let data = '虽不能至,心向往之';
fs.appendFile('./write1.txt',data,function (err) {
if(err) {
console.log('数据写入失败');
}else{
console.log('数据写入成功');
}
})
3.2同期追加
// 同步步写入的方式,数据是通过返回值赋值给变量
// 同步写入函数返回undefined. 所以一般异步同步写入数据不需要返回值
let data = "我就是一个普通的字符串"
fs.appendFileSync("index2.txt",data)
4.ファイル/フォルダー情報を読み取る
4.1文法
非同期読み取り:
fs.stat( "ファイル名"、function(err、stats){
//状態はファイルの情報オブジェクトであり、一般的に使用されるファイルの情報が含まれています
})
同期読み取り:
const stat = fs.statSync("./node")
4.2情報の読み方の例
const fs = require('fs');
fs.stat('index.txt',function (err,stats) {
// console.log(arguments)
console.log(stats)
})
結果を印刷する
Stats {
dev: 2691606309,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 5066549581201378,
//文件大小,字节数
size: 13,
blocks: 0,
atimeMs: 1587351338733.8674,
mtimeMs: 1587351338733.8674,
ctimeMs: 1587351338733.8674,
birthtimeMs: 1587351318740.8376,
// 上一次文件访问时间
atime: 2020-04-20T02:55:38.734Z,
// 文件内容修改时间
mtime: 2020-04-20T02:55:38.734Z,
// 文件状态改变时间
ctime: 2020-04-20T02:55:38.734Z,
//// 第一次创建时间
birthtime: 2020-04-20T02:55:18.741Z
}
4.3ファイル情報オブジェクトのメソッド
構文:
stats.isFile()
ファイルかどうかを判別
stats.isDirectory()
それがフォルダー(ディレクトリー)であるかどうかを判別する
const fs = require('fs');
fs.stat('index.txt',function (err,state) {
//判断是不是文件
console.log(state.isFile());
})
印刷結果は正しい
4.4ファイル名の変更を変更する
const fs = require("fs");
fs.rename("./index.txt", '123.txt', err => {
if(err) throw err
console.log("done!")
})
5.ディレクトリを削除します
fs.unlink(path,callback)
// 断开连接式的删除文件
例:
const fs = require("fs");
fs.unlink("123.txt", function (err) {
if (err) {
throw err
} else {
console.log("删除成功")
}
})
6.新しいディレクトリ
fs.mkdir(path,callback)
サンプルコード:
fs.mkdir("./test",function(err){
if (err) {
throw err
} else {
console.log("删除成功")
}
})
7.ディレクトリ内のファイルのリストを読み取ります
fs.readdir(path,callback)
サンプルコード:
fs.readdir("../read",function(err,list){
console.log(list)
// list 是读取文件夹列表
})
// 如果文件夹存在的话,list是 一个node文件夹下所有文件以及文件夹的数组集合
// 如果文件夹不存在就是err
8.空のフォルダを削除します
fs.rmdir(path,callback)
サンプルコード:
fs.rmdir("../null",function(err){
// err 报错信息
})
9.監視ファイルが変更されたかどうか
// watch是监听 文件夹内所有的文件变化
fs.watch("./",{
recursive: false // 默认是flase 是否递归监听
}, (changeType, filename) => {
console.log(chaneType) // 改变的类型 ,是修改一个文件 还是新增文件亦或是删除文件
console.log(filename) // 修改的文件名字
})
// watchFile 是监听一个文件的变化
fs.watchFile('./node/1.txt',(c,p) => {
console.log(p);
console.log(c)
})
2. Fsストリーミングの読み取りと書き込み
1.ストリームの紹介
readでファイルを読み取る方法では、ファイル全体をキャッシュ領域に読み取ってから使用します.writeメソッドでファイルに書き込むと、ファイル全体がキャッシュ領域に読み取られ、変更後にファイルにファイルが書き込まれます(つまり、読み取りと書き込みの両方で、ファイルは全体として見なされます。ノードはメモリ内のファイルと同じサイズのキャッシュスペースを開く必要があります。ファイルが小さい場合、実際には問題はありません。非常に大きいファイルである場合、メモリサイズを超える場合はどうすればよいですか? ?
インターネット上で送信されるすべてのデータは、ストリーミング方式で送信されます。
2.ストリームの操作
2.1ストリーミングの読み取り
// 1. 创建读取流
var stream = fs.createReadStream(path)
// 2. 绑定data事件接受数据
stream.on("data",function(data){
console.log(data)
console.log(1) // 打印几次,表示数据分了几次流
})
// 3. 绑定end事件表示读取完毕
end 表示在读取流读取完毕后触发的时间
stream.on("end",function(){
console.log("数据流读取完毕")
})
// 4. 绑定error错误事件
读取流事件:error 表示在读取流读取错误时后触发的时间
stream.on("error",function(err){
throw err
})
例:
// 2.1 创建一个可读流
let stream = fs.createReadStream("./index2.txt")
// console.log(stream)
let data = "";
// 2.2 绑定接受数据的事件
stream.on("data", function(buf){
// console.log(2);
// console.log(buf.toString());
data += buf;
})
// 2.3 当数据读取完毕以后会触发end事件
stream.on("end", function(){
console.log("数据读取完毕");
})
2.2失われた書き込み:
// 1. 创建写入流
var stream = fs.createWriteStream(path)
// 2. 写入数据
stream.write("数据1")
// 3. 写入完毕后结束写入流
stream.end()
// 4. 数据写入完成事件
stream.on("finish",function(){
})
// 5. 绑定error出错事件
stream.on("error",function(err){
})
例:
const fs = require("fs");
// 创建一个写入流
var stream = fs.createWriteStream("./index1.txt");
// 写入数据
stream.write("太阳当空照");
stream.write("花儿对我笑");
stream.write("小鸟说:早早早");
stream.write("你为什么背上小书包");
stream.write("我要上学校");
stream.end(); // 已流的方式写入数据必须显示的声明结束
3. Fsパイプライン方式
1.パイプの概念
パイプは、Node.Jsのストリームの実装メカニズムです。パイプは、出力ストリームから入力ストリームにデータを渡すためのメカニズムを提供します。通常、あるストリームからデータを取得し、そのデータを別のストリームに渡すために使用されます。
2.パイプラインの構文
文法
出力stream.pipe(入力ストリーム)
効果
パイプラインは大きなファイルに操作を実装できます(ファイルサイズがメモリを超えています)
2.1パイプなしでファイルをコピーする
//引入fs模块
const fs = require('fs');
//创建读取流和写入流
let s1 = fs.createReadStream('./index1.txt');
let s2 = fs.createReadStream('./index2.txt');
//读入完成后,写入完成
s1.on('data',function (d) {
s2.write(d);
})
//引入fs模块
s1.on('end',function () {
s2.end();
console.log("复制完成")
})
2.2パイプラインでファイルをコピーする
const fs = require("fs");
// 创建读取流和写入流
let s1 = fs.createReadStream("./index1.txt");
let s2 = fs.createWriteStream("./index2.txt");
s1.pipe(s2);