什么是fs(文件系統(tǒng))
- file system
- 在Node中眉孩,與文件的交互是非常重要的纹笼,服務器的本質就是將本地的文件發(fā)送給遠程的客戶端
- Node通過fs模塊來和文件系統(tǒng)進行交互
- 該模塊提供了一些標準文件訪問API來打開,讀取丐重,寫入文件钉迷,以及其他的交互
- Node中使用fs模塊丑罪,
const fs = require('fs')
fs中的同步和異步
- fs模塊中的所有操作都有兩種操作形式爪模,即同步和異步
- 同步文件系統(tǒng)會阻塞系統(tǒng)的執(zhí)行沃琅,也就是除非操作完成,否則代碼不會往下繼續(xù)執(zhí)行了
- 異步文件系統(tǒng)不會阻塞程序的執(zhí)行,而是在操作完成是蒿柳,通過回調函數(shù)將結果返回
fs的使用
文件寫入
-
手動操作的步驟
-
打開文件
- 同步:
fs.openSync(path[, flags[, mode]])
- path:要打開的文件的路徑
- flags:打開文件要做的操作類型(下面會詳細介紹有多一些操作類型)
- r:只讀的
- w:可寫的
- a: 追加
- mode:可選值,是設置文件的操作權限漩蟆,一般不傳
- 該方法會返回一個文件的描述符作為結果垒探,我們可以通過該描述符來對文件進行各種操作
- 異步:
fs.open(path[, flags[, mode]], callback)
- callback:兩個返回參數(shù)
- err:錯誤對象,如果沒有就是null
- fa:文件的描述符
- callback:兩個返回參數(shù)
- 同步:
-
向文件中寫入內容
- 同步:
fs.writeSync(fd, string[, position[, encoding]])
- fd:文件的描述符怠李,需要傳遞要寫入的描述符
- string:要寫入的內容
- position:一般不寫圾叼,表示寫入的起始位置
- encoding:一般不寫,表示編碼捺癞,默認utf-8
- 異步:
fs.write(fd, string[, position[, encoding]], callback)
- 同步:
-
保存并關閉文件
-
fs.closeSync(fd)
- fd:要關閉文件的描述符
fs.close(fd[, callback])
-
// 同步寫入文件 const fs = require('fs') // 打開文件 let fd = fs.openSync('demo.txt','w') // 寫入文件 fs.writeSync(fd, "仙劍奇?zhèn)b傳三") // 關閉文件 fs.closeSync(fd)
// 異步寫入文件 const fs = require('fs') // 打開文件 fs.open('demo2.txt','w',function(err,fd) { if(!err) { // 寫入文件 fs.write(fd,'愛情公寓',function(err) { if(!err) { console.log('寫入成功') } // 關閉文件 fs.close(fd,function(err) { if(!err) { console.log('已保存并關閉文件') } }) }) }else{ console.log('出錯了') } })
-
-
簡單文件寫入
- 同步:
fs.writeFileSync(file, data[, options])
- 異步:
fs.writeFile(file, data[, options], callback)
- file:要操作的文件的路徑
- data:要寫入的數(shù)據(jù)
- options:可選夷蚊,可以對寫入進行一些設置,是一個對象髓介,有三個值
- encoding:編碼惕鼓。默認 'utf8'
- mode:文件權限。默認 0o666
- flag:文件只讀還是可寫唐础。默認 'w' (下面會詳細介紹有多一些操作類型)
- callback:當寫入完成以后箱歧,執(zhí)行
// 簡單文件寫入 const fs = require('fs') // 異步 fs.writeFile('demo3.txt','景天和雪見',function(err) { if(!err){ console.log('寫入成功') } }) // 同步 fs.writeFileSync('demo4.txt','紫萱和徐長卿')
- 同步:
-
流式文件寫入
- 同步,異步一膨,簡單文件寫入都不適合大文件寫入呀邢,所以有了流式文件寫入
- 用法:創(chuàng)建一個可寫流,
fs.createWriteStream(path[, options])
// 流式文件寫入 const fs = require('fs') // 創(chuàng)建一個可寫流 let ws = fs.createWriteStream('demo.txt') // 通過ws想文件中輸出內容 ws.write("通過可寫流寫入的內容") // 關閉流,不能用ws.close(),不然文件傳不完 ws.end()
-
flag: 文件操作類型有哪些
- r:讀取文件豹绪,文件不存在則出現(xiàn)異常
- r+:讀寫文件价淌,文件不存在則出現(xiàn)異常
- rs:在同步模式下打開文件用于讀取
- rs+:在同步模式下打開文件用于讀寫
- w:打開文件用于寫操作,如果不存在則創(chuàng)建瞒津,如果存在則截斷蝉衣,截斷即覆蓋全部
- wx:打開文件用于寫操作,如果存在則打開失敗
- w+: 打開文件用于讀寫巷蚪,如果不存在則創(chuàng)建买乃,如果存在則截斷
- wx+:打開文件用于讀寫,如果存在則打開失敗
- a:打開文件用于追加钓辆,如果不存在則創(chuàng)建
- ax:打開文件用于追加剪验,如果路徑存在則失敗
- a+:打開文件進行讀取和最佳,如果不存在則創(chuàng)建
- ax+:打開文件進行讀取和追加前联,如果路徑存在則失敗
文件讀取
- 簡單文件讀取
- 同步:
fs.readFileSync(path[, options])
- 異步:
fs.readFile(path[, options], callback)
- callback(err,data)
- err:錯誤對象
- data:讀取到的數(shù)據(jù)功戚,是一個Buffer,為什么是Buffer呢似嗤?因為讀取到的不一定是字符串啸臀,可能是圖片,音頻等。Buffer的通用性更高乘粒。字符串的話可以用toString讀取數(shù)據(jù)
- callback(err,data)
// 簡單文件讀取 const fs = require('fs') fs.readFile('demo.txt',function(err,data) { if(!err) { console.log(data) console.log(data.toString()) } })
- 同步:
- 流式文件讀取
- 同樣適用于大文件
- 用法:
fs.createReadStream(path[, options])
// 流式讀取文件 const fs = require('fs') // 創(chuàng)建一個可讀流 let rs = fs.createReadStream('demo.txt') // 讀取可讀流中的數(shù)據(jù)豌注,必須要可讀流綁定一個data事件,data事件綁定完畢灯萍,他會自動讀取數(shù)據(jù) rs.on('data',function(data) { console.log(data) console.log(data.toString()) }) // 如果我們想把讀取到數(shù)據(jù)寫到另一個文件當中 let ws = fs.createWriteStream('demo1.txt') // 使用pipe(管道)轧铁,會直接輸入到ws中 rs.pipe(ws)