Node.js 初识 fs 模块
fs 模塊是文件操作的封裝,它提供了文件的讀取、寫入、更名、刪除、遍歷目錄、鏈接等 Unix 文件系統(tǒng)操作。與其他模塊不同的是,fs 模塊中所有的操作都提供了 同步 和 異步 兩個(gè)版本,比如讀取文件內(nèi)容的函數(shù)有 異步的 fs.readFile() 和 同步的 fs.readFileSync().
Node.js 導(dǎo)入文件系統(tǒng)模塊的語法如下:
1、異步和同步讀取文件
fs.readFile(file[, options], callback(err,data))
異步讀取文件的全部內(nèi)容
參數(shù):
file: ?<String>?|?<Buffer>?|?<Integer>,要讀取的文件名,必選參數(shù) ? ? ??
options: ?<Object>?|?<String>, 可選參數(shù),可指定 flag(文件操作選項(xiàng),如 r+ 讀寫;w+讀寫,文 件不存在則創(chuàng)建)及 encoding 屬性
????????encoding: ?<String>?|?<Null>,表示文件的字符編碼
????????flag:?<String>? ,默認(rèn) 'r'?
callback:?<Function>,回調(diào)函數(shù)提供了兩個(gè)參數(shù) err 和 data,err 表示有沒有錯(cuò)誤發(fā)生,data 是文件內(nèi)容
如果指定了第二個(gè)參數(shù) encoding,回調(diào)函數(shù)中的 data 是一個(gè)解析后的字符串,否則 data 將會是以 Buffer 形式表示的二進(jìn)制數(shù)據(jù)
新建一個(gè) content.txt,里面添加一行簡單的文本
你好,世界!異步讀取文件,示例代碼如下:
var?fs?=?require('fs');fs.readFile('./content.txt',?{flag:?'r+',?encoding:?'utf8'},?function(err,?data){if(err){console.error(err);return;}console.log('異步讀取:'+?data); });運(yùn)行結(jié)果如下:
當(dāng)讀取文件出現(xiàn)錯(cuò)誤時(shí),err 將會是 Error 對象。例如:讀取一個(gè)不存在的 content1.txt 文件,運(yùn)行代碼時(shí),會報(bào)如下錯(cuò)誤。
Node.js 的異步編程接口習(xí)慣是以函數(shù)的最后一個(gè)參數(shù)為回調(diào)函數(shù),通常一個(gè)函數(shù)只有一個(gè)回調(diào)函數(shù)。回調(diào)函數(shù)的實(shí)際參數(shù)中第一個(gè)是 err,其余參數(shù)是其他返回內(nèi)容。如果沒有發(fā)生錯(cuò)誤,err 的值會是 null 或 undefined。如果有錯(cuò)誤發(fā)生,err 通常是 Error 對象的實(shí)例
fs.readFileSync(file[, options])
?fs.readFile?的同步版本,返回文件的內(nèi)容
它接受的參數(shù)和 fs.readFile 相同,而讀取到的文件內(nèi)容會以函數(shù)返回值的形式返回。如果有錯(cuò)誤發(fā)生,fs 將會拋出異常,需要使用 try 和 catch 捕捉并處理異常。
與同步 I/O 函數(shù)不同,Node.js 中異步函數(shù)大多沒有返回值
同步讀取文件示例:
var?fs?=?require('fs');//同步讀取 var?data?=?fs.readFileSync('./content.txt','utf8'); console.log('同步讀取:'+?data); console.log('程序執(zhí)行完畢!');運(yùn)行結(jié)果:
2、獲取文件信息
fs.stat(path, callback)
通過異步模式獲取文件信息
參數(shù):
path:?<String>?|?<Buffer>,文件的路徑
callback:?<Function>,回調(diào)函數(shù),帶有兩個(gè)參數(shù) err 和 status,stats 是 ?fs.Stats??對象
fs.stat() 執(zhí)行后,會將 stats 類的實(shí)例返回給其回掉函數(shù)。可以通過 stats 類中提供的方法判斷文件的相關(guān)屬性,例如:判斷是否為文件夾
stats 類中的方法有:
新建一個(gè) js 文件,代碼如下:
var?fs?=?require('fs');console.log('準(zhǔn)備打開文件!');fs.stat('./content.txt',?function(err,?stats){if(err){console.err(error);}console.log(stats);console.log('讀取信息成功!');//檢測文件類型console.log('是否為文件(isFile)?'+?stats.isFile());console.log('是否為目錄(isDirectory)?'+?stats.isDirectory()); })運(yùn)行結(jié)果:
3、寫入文件
fs.writeFile(file, data[, options], callback)
異步的方式把數(shù)據(jù)寫入文件,如果文件存在,該方法寫入的內(nèi)容會覆蓋舊的文件內(nèi)容
參數(shù):
file:??<String>?|?<Buffer>?|?<Integer>,要讀取的文件名,必選參數(shù) ? ? ??
data:??<String>?|?<Buffer>?,要寫入的數(shù)據(jù),可以是 ?<String>??也可以是??<Buffer>?(對象流)
options:??<Object>?|?<String>,?
????????encoding:??<String>?|?<Null>,表示文件的字符編碼,默認(rèn)'utf8'
? ? ? ? mode:?<Integer>?,權(quán)限,默認(rèn)?0o666?
????????flag:?<String>??,默認(rèn)?'w'?
callback:?<Function>,回調(diào)函數(shù)只包含錯(cuò)誤信息參數(shù)(err),在寫入失敗時(shí)返回
如果 data?是一個(gè)?<Buffer>?,那么 option 中的 encoding?會被忽略掉,將默認(rèn)為?'utf8'
示例代碼:
var?fs?=?require('fs');console.log('準(zhǔn)備寫入文件!');fs.writeFile('./content.txt',?'我是異步寫入的文件內(nèi)容',?function(err){if(err){console.err(error);}console.log('數(shù)據(jù)寫入成功!');console.log('--------------我是分割線---------------');console.log('讀取寫入的數(shù)據(jù)!');fs.readFile('./content.txt',?function(err,?data){if(err){console.err(error);}console.log('異步讀取文件數(shù)據(jù):'?+data);}) })運(yùn)行結(jié)果:
同時(shí),原來的 content.txt 中的內(nèi)容變?yōu)?#xff1a;
fs.appendFile(file, data[, options], callback)
以追加的方式寫入文件
示例代碼:
運(yùn)行結(jié)果:(在原數(shù)據(jù)后追加數(shù)據(jù),不會覆蓋原內(nèi)容)
4、讀取文件
fs.read(fd, buffer, offset, length, position, callback(err, bytesRead, buffer))
從指定的文件描述符 fd 中讀取數(shù)據(jù)并寫入 buffer 指向的緩沖區(qū)對象
參數(shù):
fd?: ?<Integer>,使用 fs.open 打開成功后返回的文件描述符
buffer?:?<String>?|?<Buffer>?,一個(gè) buffer 對象,V8引擎分配的一段內(nèi)存
offset?:?<Integer>?,整數(shù),向緩存區(qū)中寫入時(shí)的初識位置,以字節(jié)為單位
length?:?<Integer>?,整數(shù),讀取文件的長度
position?:?<Integer>?,整數(shù),讀取文件的初識位置;文件大小以字節(jié)為單位
如果 position??為 null,將從當(dāng)前文件指針的位置讀取
callback?:?<Function>?,讀取執(zhí)行完成后的回調(diào)函數(shù),有三個(gè)參數(shù)?err, bytesRead, buffer
?????- err:錯(cuò)誤信息
???? - bytesRead:表示讀取的字節(jié)數(shù)
???? - buffer:緩沖區(qū)對象
示例代碼如下:
var?fs?=?require('fs');var?buf?=?new?Buffer(1024);console.log('準(zhǔn)備打開已存在的文件!'); fs.open('./content.txt',?'r+',?function(err,?fd){if(err){console.error(err);}console.log('文件打開成功!');console.log('準(zhǔn)備讀取文件:');fs.read(fd,?buf,?0,?buf.length,?0,?function(err,?bytes){if(err){console.error(err);}//每一個(gè)漢字utf8編碼是3個(gè)字節(jié)console.log(bytes+?'字節(jié)被讀取');//僅輸出讀取的字節(jié)if(bytes?>0){console.log(buf.slice(0,?bytes));}}) });運(yùn)行結(jié)果:
5、打開文件
fs.open(path, flags[, mode], callback(err, fd))
異步的方式打開文件
path:?<String>?|?<Buffer>,文件的路徑
flags:?<String>?|?<Number>,文件打開的行為,具體參考下表
mode:?<Integer>,設(shè)置文件模式(權(quán)限),文件創(chuàng)建默認(rèn)權(quán)限為 0666(可讀,可寫)
callback:?<Function>,回調(diào)函數(shù),帶有兩個(gè)參數(shù) err 和 fd
flags 參數(shù)可以是以下值:
示例代碼:以讀寫模式打開文件 content.txt
var?fs?=?require('fs');//異步打開文件 console.log('準(zhǔn)備打開文件!'); fs.open('./content.txt','r+',function(err,?fd){if(err){return?console.error(err);}console.log('文件打開成功!'); });運(yùn)行結(jié)果:
fs.openSync(path, flags[, mode])
?fs.open()?的同步版本,返回一個(gè)??<Integer>?代表讀取的文件
6、創(chuàng)建目錄
fs.mkdir(path[, mode], callback(err))
創(chuàng)建目錄
參數(shù):
path :?<String>?|?<Buffer>?,被創(chuàng)建目錄的完整路徑及目錄名
[mode]?:?<Integer>?,整數(shù),目錄權(quán)限,默認(rèn) 0777
callback?:?<Function>?,創(chuàng)建完目錄回調(diào)函數(shù),err 錯(cuò)誤對象
示例代碼:
var?fs?=?require('fs');console.log('創(chuàng)建目錄?/src/test');fs.mkdir('src/test',?function(err){if(err){console.error(err);}console.log('目錄創(chuàng)建成功!'); });創(chuàng)建前截圖:
創(chuàng)建后截圖:
轉(zhuǎn)載于:https://blog.51cto.com/dapengtalk/1890453
總結(jié)
以上是生活随笔為你收集整理的Node.js 初识 fs 模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA 面向对象-2-继承(Inher
- 下一篇: 【转】两种方法教你在Ubuntu下轻松关