node.js中fs模塊系統的使用:
Node.js 文件系統(fs 模塊)模塊中的方法均有異步和同步版本,例如讀取文件內容的函數有異步的 fs.readFile() 和同步的 fs.readFileSync()。
異步的方法函數最後一個參數爲回調函數,回調函數的第一個參數包含了錯誤信息(error)。
建議大家使用異步方法,比起同步,異步方法性能更高,速度更快,而且沒有阻塞
1.讀取文件:
讀取文件:readFile(filename,[options],callback);
filename, 必選參數,文件名
[options],可選參數,可指定flag 默認爲‘r’,encoding 默認爲null,在讀取的時候,需要手動指定
callback 讀取文件後的回調函數,參數默認第一個err,第二個data 數據
//文件流模塊 fs
//fs node 的內置模塊 文件模塊 文件讀取寫入之類的事情
//1.引入文件模塊
const fs=require("fs");
module.exports=()=>{
//readFile 異步讀取
fs.readFile("public/mongodb.txt",(err,data) => {
if(err){
throw err;
}
let buf=new Buffer(data);
console.log(data.toString("utf-8"));
});
//同步讀取方法 readFileSync
let a=fs.readFileSync("public/mongodb.txt","utf-8");
console.log(a);
}
2.打開文件
打開文件:fs.open(filename, flags, [mode], callback);
filename, 必選參數,文件名
flags, 操作標識,如"r",讀方式打開,r+可讀可寫
[mode],設置文件模式(權限),文件創建默認權限爲 0666(可讀,可寫)。
callback 打開文件後回調函數,參數默認第一個err,第二個fd爲一個整數,表示打開文件返回的文件描述符,window中又稱文件句柄
//異步打開文件夾
fs.open("public","r+",(err,id)=>{
if(err){
console.log("打開文件失敗")
throw err;
}
console.log("當前文件已經打開");
});
//同步打開文件
let b=fs.openSync("public","r+")
console.log(b);
3.獲取文件信息
.獲取文件信息:fs.stat(path, callback)
path - 文件路徑。
callback - 回調函數,帶有兩個參數如:(err, stats), stats 是 fs.Stats 對象
fs.stat("public",(err,stat)=>{
if(err){
throw err;
}
//console.log(stat)//輸出文件的相關信息
//stat返回值裏面的方法
//isFile 檢測當前文件是文件還是文件夾 true
//isDirectory 檢測當前文件是文件還是文件夾 true
console.log(stat.isFile());
console.log(stat.isDirectory());
});
4.寫入文件
創建並寫入文件:fs.writeFile(filename,data,[options],callback);
filename, 必選參數,文件名
data, 寫入的數據,可以字符或一個Buffer對象
[options],flag 默認‘2’,mode(權限) 默認‘0o666’,encoding 默認‘utf8’
callback 回調函數,回調函數只包含錯誤信息參數(err),在寫入失敗時返回。
fs.writeFile("public/mode.txt","我想學習","utf-8",(err)=>{
if(err){
throw err;
}
});
//同步寫入
fs.writeFileSync("public/mode.txt","我在學習中","utf-8"");
//異步方法 appendFile 追加寫入
fs.appendFile("public/mode.txt","我想學習a","utf-8",(err)=>{
if(err){
throw err;
}
})
//同步追加appendFileSync
5.文件讀取
fs.read(fd, buffer, offset, length, position, callback); 讀取文件 ,讀取打開的文件內容到緩衝區中
fd, 使用fs.open打開成功後返回的文件描述符
buffer, 一個Buffer對象,v8引擎分配的一段內存
offset, 整數,向緩存區中寫入時的初始位置,以字節爲單位
length, 整數,讀取文件的長度
position, 整數,讀取文件初始位置;文件大小以字節爲單位
callback(err, bytesRead, buffer), 讀取執行完成後回調函數,bytesRead實際讀取字節數,被讀取的緩存區對象
let buffer=new Buffer(1024);
fs.open("public/mongodb.txt","r+",(err,fd)=>{
if(err){
throw err;
}
fs.read(fd,buffer,0,buffer.length,buffer.length,(err,res)=>{
if(err){
throw err;
}
fs.appendFile("public/mode.txt",buffer.toString("utf-8"),(err)=>{
if(err){
throw err;
console.log("寫入失敗");
}
console.log("寫入成功")
})
console.log(buffer.toString("utf-8"));
});
});
6.關閉文件
fs.open("public/mongodb.txt","r+",(err,fd)=>{
if(err){
throw err;
}
console.log("文件已經打開");
//文件關閉代碼
fs.close(fd,(error)=>{
if(error){
throw error;
}
console.log("文件關閉成功")
});
});
7.文件的截取
fs.ftruncate(fd, len, callback) 截取文件
fd - 通過 fs.open() 方法返回的文件描述符。
len - 文件內容截取的長度。
callback - 回調函數,沒有參數。
let databuff=new Buffer(1024);
fs.open("public/mongodb.txt","r+",(err,fd)=>{
if(err){
throw err;
}
//ftruncate 截取文件
fs.ftruncate(fd,1024,(error)=>{
if(error){
throw error;
}
console.log("文件截取成功");
fs.read(fd,databuff,0,databuff.length/2,0,(error,byte)=>{
if(error){
throw error;
}
console.log(databuff.toString("utf-8"));
//文件關閉
fs.close(fd,(er)=>{
if(er){
throw er;
}
})
});
});
});
//fs.ftruncateSync同步截取
8.刪除文件
fs.exists(path, callback); 判斷文件或目錄是否存在
path, 要查看目錄/文件的完整路徑及名;
[callback(exists)], 操作完成回調函數;exists true存在,false表示不存在
fs.unlink("public/stu.txt",(err)=>{
if(err){
throw err;
}
console.log("文件刪除成功")
});
9.創建目錄+刪除目錄
fs.mkdir(path, [mode], callback)創建目錄
path是需要創建的目錄
[mode]是目錄的權限(默認值是0777)
callback 是回調函數。
let nickname="王五";
fs.exists(`public/${nickname}`,(exis)=>{
console.log(exis);
if(!exis){
fs.mkdir(`public/${nickname}`,{
mode:0777
},(err)=>{
if(err){
throw err;
}
console.log("文件創建成功");
//rmdir 刪除目錄
fs.rmdir(`public/${nickname}`,(error)=>{
if(error){
throw error;
}
console.log("刪除成功");
});
});
}
else{
console.log("該文件存在");
}
fs.appendFile(`public/${nickname}`+`/host.txt`,"我在嘗試study",(err)=>{
if(err){
throw err;
}
console.log("寫入成功");
})
})
10.讀取目錄(fs.readdir(path, callback))
//遞歸遍歷目錄裏面的每一層
let pathinfo="public";
let method=(path)=>{
fs.readdir(path,(err,files)=>{
if(err){
throw err;
}
//[ 'data.txt', 'maodou', 'mark', 'mode.txt', 'mongodb.txt', '王五' ]
//console.log(files);
files.map((value,index)=>{
//console.log(value);
fs.stat(path+`/${value}`,(error,stats)=>{
if(error){
throw error;
}
//開始判斷是否是目錄還是文件夾
if(stats.isFile()){
console.log(value+"是文件");
}
else if(stats.isDirectory()){
console.log(value+"是目錄");
method(path+`/${value}`);
}
});
});
});
}
method(pathinfo);