fs 模塊是文件操作的封裝,它提供了文件的讀取、寫入、更名、刪除、遍歷目錄、鏈接等 Unix 文件系統操作。與其他模塊不同的是,fs 模塊中所有的操作都提供了 同步 和 異步 兩個版本,比如讀取文件內容的函數有 異步的 fs.readFile() 和 同步的 fs.readFileSync().
Node.js 導入文件系統模塊的語法如下:
var fs = require('fs');
1、異步和同步讀取文件
fs.readFile(file[, options], callback(err,data))
異步讀取文件的全部內容
參數:
file: <String> | <Buffer> | <Integer>,要讀取的文件名,必選參數
options: <Object> | <String>, 可選參數,可指定 flag(文件操作選項,如 r+ 讀寫;w+讀寫,文 件不存在則創建)及 encoding 屬性
encoding: <String> | <Null>,表示文件的字符編碼
flag: <String> ,默認 'r'
callback: <Function>,回調函數提供了兩個參數 err 和 data,err 表示有沒有錯誤發生,data 是文件內容
如果指定了第二個參數 encoding,回調函數中的 data 是一個解析後的字符串,否則 data 將會是以 Buffer 形式表示的二進制數據
新建一個 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); });
運行結果如下:
當讀取文件出現錯誤時,err 將會是 Error 對象。例如:讀取一個不存在的 content1.txt 文件,運行代碼時,會報如下錯誤。
Node.js 的異步編程接口習慣是以函數的最後一個參數爲回調函數,通常一個函數只有一個回調函數。回調函數的實際參數中第一個是 err,其餘參數是其他返回內容。如果沒有發生錯誤,err 的值會是 null 或 undefined。如果有錯誤發生,err 通常是 Error 對象的實例
fs.readFileSync(file[, options])
fs.readFile
的同步版本,返回文件的內容
它接受的參數和 fs.readFile 相同,而讀取到的文件內容會以函數返回值的形式返回。如果有錯誤發生,fs 將會拋出異常,需要使用 try 和 catch 捕捉並處理異常。
與同步 I/O 函數不同,Node.js 中異步函數大多沒有返回值
同步讀取文件示例:
var fs = require('fs'); //同步讀取 var data = fs.readFileSync('./content.txt','utf8'); console.log('同步讀取:'+ data); console.log('程序執行完畢!');
運行結果:
2、獲取文件信息
fs.stat(path, callback)
通過異步模式獲取文件信息
參數:
path: <String> | <Buffer>,文件的路徑
callback: <Function>,回調函數,帶有兩個參數 err 和 status,stats 是 fs.Stats
對象
fs.stat() 執行後,會將 stats 類的實例返回給其回掉函數。可以通過 stats 類中提供的方法判斷文件的相關屬性,例如:判斷是否爲文件夾
var fs = require('fs'); fs.stat('/Users/liuht/code/itbilu/demo/fs.js', function (err, stats) { console.log(stats.isFile()); //true })
stats 類中的方法有:
新建一個 js 文件,代碼如下:
var fs = require('fs'); console.log('準備打開文件!'); 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()); })
運行結果:
3、寫入文件
fs.writeFile(file, data[, options], callback)
異步的方式把數據寫入文件,如果文件存在,該方法寫入的內容會覆蓋舊的文件內容
參數:
file: <String> | <Buffer> | <Integer>,要讀取的文件名,必選參數
data: <String> | <Buffer> ,要寫入的數據,可以是 <String> 也可以是 <Buffer> (對象流)
encoding: <String> | <Null>,表示文件的字符編碼,默認'utf8'
mode: <Integer> ,權限,默認 0o666
flag: <String> ,默認 'w'
callback: <Function>,回調函數只包含錯誤信息參數(err),在寫入失敗時返回
如果 data 是一個 <Buffer> ,那麼 option 中的 encoding 會被忽略掉,將默認爲 'utf8'
示例代碼:
var fs = require('fs'); console.log('準備寫入文件!'); fs.writeFile('./content.txt', '我是異步寫入的文件內容', function(err){ if(err){ console.err(error); } console.log('數據寫入成功!'); console.log('--------------我是分割線---------------'); console.log('讀取寫入的數據!'); fs.readFile('./content.txt', function(err, data){ if(err){ console.err(error); } console.log('異步讀取文件數據:' +data); }) })
運行結果:
同時,原來的 content.txt 中的內容變爲:
fs.appendFile(file, data[, options], callback)
以追加的方式寫入文件
示例代碼:
var fs = require('fs'); fs.appendFile('./content.txt', '我是被追加寫入的數據', function(err){ if(err){ console.log(error); } }); fs.readFile('./content.txt', function(err, data){ if(err){ console.log(error); } console.log('異步讀取文件數據:' +data); })
運行結果:(在原數據後追加數據,不會覆蓋原內容)
4、讀取文件
fs.read(fd, buffer, offset, length, position, callback(err, bytesRead, buffer))
從指定的文件描述符 fd 中讀取數據並寫入 buffer 指向的緩衝區對象
參數:
fd : <Integer>,使用 fs.open 打開成功後返回的文件描述符
buffer : <String> | <Buffer> ,一個 buffer 對象,V8引擎分配的一段內存
offset : <Integer> ,整數,向緩存區中寫入時的初識位置,以字節爲單位
length : <Integer> ,整數,讀取文件的長度
position : <Integer> ,整數,讀取文件的初識位置;文件大小以字節爲單位
如果 position 爲 null,將從當前文件指針的位置讀取
callback : <Function> ,讀取執行完成後的回調函數,有三個參數 err, bytesRead, buffer
- err:錯誤信息
- bytesRead:表示讀取的字節數
- buffer:緩衝區對象
示例代碼如下:
var fs = require('fs'); var buf = new Buffer(1024); console.log('準備打開已存在的文件!'); fs.open('./content.txt', 'r+', function(err, fd){ if(err){ console.error(err); } console.log('文件打開成功!'); console.log('準備讀取文件:'); fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){ if(err){ console.error(err); } //每一個漢字utf8編碼是3個字節 console.log(bytes+ '字節被讀取'); //僅輸出讀取的字節 if(bytes >0){ console.log(buf.slice(0, bytes)); } }) });
運行結果:
5、打開文件
fs.open(path, flags[, mode], callback(err, fd))
異步的方式打開文件
path: <String> | <Buffer>,文件的路徑
flags: <String> | <Number>,文件打開的行爲,具體參考下表
mode: <Integer>,設置文件模式(權限),文件創建默認權限爲 0666(可讀,可寫)
callback: <Function>,回調函數,帶有兩個參數 err 和 fd
flags 參數可以是以下值:
示例代碼:以讀寫模式打開文件 content.txt
var fs = require('fs'); //異步打開文件 console.log('準備打開文件!'); fs.open('./content.txt','r+',function(err, fd){ if(err){ return console.error(err); } console.log('文件打開成功!'); });
運行結果:
fs.openSync(path, flags[, mode])
fs.open()
的同步版本,返回一個 <Integer> 代表讀取的文件
6、創建目錄
fs.mkdir(path[, mode], callback(err))
創建目錄
參數:
path : <String> | <Buffer> ,被創建目錄的完整路徑及目錄名
[mode] : <Integer> ,整數,目錄權限,默認 0777
callback : <Function> ,創建完目錄回調函數,err 錯誤對象
示例代碼:
var fs = require('fs'); console.log('創建目錄 /src/test'); fs.mkdir('src/test', function(err){ if(err){ console.error(err); } console.log('目錄創建成功!'); });
創建前截圖:
創建後截圖: