在nodeJs中,所有的文件操作都是通過fs核心模塊來實現(xiàn)的,包括文件目錄的創(chuàng)建、刪除、查詢以及文件的讀取和寫入,在fs模塊中所有的方法都分為同步和異步倆種方法實現(xiàn)。
sync后綴則為同步方法,無后綴則為異步方法。
文件權限
linux && unix中
在系統(tǒng)中文件權限會根據(jù)文件所有者(自己)、組(家庭組)、其他用戶(陌生人)進行分配,
文件操作權限又分為讀寫執(zhí)行 (八進制 )4、2、1、0。0代表不具備權限
nodeJS標識位 flag
r 讀取文件,如果文件不存在則拋出異常。
r+ 讀取并寫入文件,如果文件不存在則拋出異常。
rs 讀取并寫入文件,指示操作系統(tǒng)繞開本地文件系統(tǒng)緩存。
w 寫入文件,文件不存在會被創(chuàng)建,存在則清空后寫入。
wx 寫入文件,排它方式打開。
w+ 讀取并寫入文件,文件不存在則創(chuàng)建文件,存在則清空后寫入。
wx+ 和 w+ 類似,排他方式打開。
a 追加寫入,文件不存在則創(chuàng)建文件。
ax 與 a 類似,排他方式打開。
a+ 讀取并追加寫入,不存在則創(chuàng)建。
ax+ 與 a+ 類似,排他方式打開
文件描述符 fd
操作系統(tǒng)會為每個打開的文件分配一個名為文件描述符的數(shù)值標識,文件操作使用這些文件描述符來識別與追蹤每個特定的文件,Window 系統(tǒng)使用了一個不同但概念類似的機制來追蹤資源,為方便用戶,NodeJS 抽象了不同操作系統(tǒng)間的差異,為所有打開的文件分配了數(shù)值的文件描述符。
在 NodeJS 中,每操作一個文件,文件描述符是遞增的,文件描述符一般從 3 開始,因為前面有 0 、 1 、 2 三個比較特殊的描述符,分別代表 process.stdin (標準輸入)、 process.stdout (標準輸出)和 process.stderr (錯誤輸出)。
fs模塊
一、同步和異步
使用require('fs')載入fs模塊,模塊中所有方法都有同步和異步兩種形式。
異步方法中回調函數(shù)的第一個參數(shù)總是留給異常參數(shù)(exception),如果方法成功完成,該參數(shù)為null或undefined。
同步方法執(zhí)行完并返回結果后,才能執(zhí)行后續(xù)的代碼。而異步方法采用回調函數(shù)接收返回結果,可以立即執(zhí)行后續(xù)代碼。
異步寫法:有一個回調函數(shù)。
var fs = require('fs'); // 載入fs模塊
fs.unlink('/tmp/shiyanlou', function(err) {
if (err) {
throw err;
}
console.log('成功刪除了 /tmp/shiyanlou');
});
同步寫法:
var fs = require('fs');
fs.unlinkSync('/tmp/shiyanlou'); // Sync 表示是同步方法
console.log('成功刪除了 /tmp/shiyanlou');
二、readFile讀取文件
//fs.readFile(filename,[option],callback)
//filename String 文件名
//option Object
//encoding String |null default=null
//flag String default='r'
//callback Function
var fs = require('fs'); // 引入fs模塊
fs.readFile('./test.txt', function(err, data) {
// 讀取文件失敗/錯誤
if (err) {
throw err;
}
// 讀取文件成功
console.log(data);
});
node 讀取文件.js 運行程序
可以發(fā)現(xiàn) 文件內容為2進制數(shù)據(jù) <Buffer xx xx xx xx.....>
要顯示文件內容可以使用toString() 或者設置輸出編碼。
//toString()寫法:
fs.readFile('./test.txt', function(err, data) {
// 讀取文件失敗/錯誤
if (err) {
throw err;
}
// 讀取文件成功
console.log(data.toString());
});
//設置編碼格式
fs.readFile('./test.txt', 'utf-8', function(err, data) {
// 讀取文件失敗/錯誤
if (err) {
throw err;
}
// 讀取文件成功
console.log('utf-8: ', data.toString());
//直接用console.log(data);也可以
});
同步寫法沒有回調函數(shù)
fs.readFileSync(filename,[options])。
WriteFile寫入文件
//使用fs.writeFile(filename,data,[options],callback)寫入內容到文件。
//參數(shù)說明:
//filename String 文件名
//data String|buffer
//option Object
//encoding String |nulldefault='utf-8'
//mode Number default=438(aka 0666 in Octal)
//flag Stringdefault='w'
//callback Function
//demo
var fs = require('fs'); // 引入fs模塊
// 寫入文件內容(如果文件不存在會創(chuàng)建一個文件)
// 寫入時會先清空文件
fs.writeFile('./test2.txt', 'test test', function(err) {
if (err) {
throw err;
}
console.log('Saved.');
// 寫入成功后讀取測試
fs.readFile('./test2.txt', 'utf-8', function(err, data) {
if (err) {
throw err;
}
console.log(data);
});
});
參數(shù)option{}中 flag 默認值 w,即會清空文件 ,想要追加,可以傳遞flag 參數(shù),
文件讀寫操作進階
fs.read && fs.write 功能類似 fs.readFile && fs.writeFile,但提供更底層的操作;
使用fs.read 和fs.write 前 需要使用 fs.open 打開文件 和 fs.close 關閉文件。
1.fs.open
fs.open(path,flags,[mode],callback)方法用于打開文件,以便fs.read()讀取。
參數(shù):
- path 文件路徑
- flags打開文件的方式
- [mode] 是文件的權限(可行參數(shù),默認值是0666)
- callback 回調函數(shù)
flags以及model(權限) 在上方有介紹;
2.fs.close
fs.close(fd,[callback]) 方法用于關閉文件
參數(shù) :
fd 為文件的描述符,標識,fs.open()方法中的回調函數(shù)中返回的第二個參數(shù)即為fd;
callback 關閉成功回調函數(shù);
3.fs.read
fs.read(fd,buffer,offset,length,position,callback) 接收6個參數(shù)。
- fd 文件描述符,必須接收fs.open()方法中的回調函數(shù)返回的第二個參數(shù)。
- buffer 是存放讀取到的數(shù)據(jù)的Buffer對象。
- offset 指定 向buffer中存放數(shù)據(jù)的起始位置。
- length 指定 讀取文件中數(shù)據(jù)的字節(jié)數(shù)。
- position 指定 在文件中讀取文件內容的起始位置。
- callback 回調函數(shù),參數(shù)如下
- err 用于拋出異常
- bytesRead 從文件中讀取內容的實際字節(jié)數(shù)。
- buffer 被讀取的緩存區(qū)對象。
123連起來的demo如下:
var fs = require('fs'); // 引入fs模塊
// 打開文件
fs.open('./testread.txt', 'r', function(err, fd) {
if (err) {
throw err;
}
console.log('open file success.');
var buffer = new Buffer(255);
// 讀取文件
fs.read(fd, buffer, 0, 10, 0, function(err, bytesRead, buffer) {
if (err) {
throw err;
}
// 打印出buffer中存入的數(shù)據(jù)
console.log(bytesRead, buffer.slice(0, bytesRead).toString());
// 關閉文件
fs.close(fd);
});
});
fs.write()
fs.write(fd,buffer,offset,length[,position],callback(err,bytesWritten,buffer))接收6個參數(shù)。
- fd 文件描述符。
- buffer 緩沖區(qū),數(shù)據(jù)將被寫入。buffer尺寸的大小設置最好是8的倍數(shù),效率較高。
- offset buffer寫入的偏移量
- length (integer) 指定文件讀取字節(jié)數(shù)長度
- position (integer) 指定文件讀取的起始位置,如果該項為null,將從當前文件指針的位置開始讀取數(shù)據(jù)。
- callback 回調傳遞了三個參數(shù),err, bytesRead, buffer
- err 異常
- bytesRead:讀取的字節(jié)數(shù)
- buffer:緩沖區(qū)對象
var fs = require('fs'); // 引入fs模塊
// 打開文件
fs.open('./testwrite.txt', `w`, function(err, fd) {
if (err) {
throw err;
}
console.log('open file success.');
var buffer = new Buffer('shiyanlou');
// 讀取文件
fs.write(fd, buffer, 0, 6, 0, function(err, bytesWritten, buffer) {
if (err) {
throw err;
}
console.log('write success.');
// 打印出buffer中存入的數(shù)據(jù)
console.log(bytesWritten, buffer.slice(0, bytesWritten).toString());
// 關閉文件
fs.close(fd);
});
});
目錄操作
1、創(chuàng)建目錄
fs.mkdir(path,[mode],callback)創(chuàng)建目錄,path是需要創(chuàng)建的目錄,[mode]是目錄的權限(默認是0777),callback是回調函數(shù)
var fs = require('fs'); // 引入fs模塊
// 創(chuàng)建 newdir 目錄
fs.mkdir('./newdir', function(err) {
if (err) {
throw err;
}
console.log('make dir success.');
});
2、讀取目錄
使用fs.readdir(path,callback)讀取文件目錄。
var fs = require('fs'); // 引入fs模塊
fs.readdir('./newdir', function(err, files) {
if (err) {
throw err;
}
// files是一個數(shù)組
// 每個元素是此目錄下的文件或文件夾的名稱
console.log(files);
});