Node.js fs 模塊

實驗簡介

fs模塊用于對系統(tǒng)文件及目錄進行讀寫操作
參考鏈接:http://nodejs.org/api/fs.html

一、同步和異步

使用require('fs')載入fs模塊,模塊中所有方法都有同步和異步兩種形式。
異步方法中回調(diào)函數(shù)的第一個參數(shù)總是留給異常參數(shù)(exception),如果方法成功完成,那么這個參數(shù)為null或者undefined。

異步方法實例代碼(無需在虛擬機中編寫):
<pre>
var fs = require('fs'); // 載入fs模塊
fs.unlink('/tmp/shiyanlou', function(err) {
if (err) {
throw err;
}
console.log('成功刪除了 /tmp/shiyanlou');
});
</pre>
同步方法實例代碼(無需在虛擬機中編寫):
<pre>
var fs = require('fs');

fs.unlinkSync('/tmp/shiyanlou'); // Sync 表示是同步方法
console.log('成功刪除了 /tmp/shiyanlou');
</pre>

同步方法執(zhí)行完并返回結果后,才能執(zhí)行后續(xù)的代碼。而異步方法采用回調(diào)函數(shù)接收返回結果,可以立即執(zhí)行后續(xù)的代碼

二、readFile讀取文件

使用fs.readFile(filename, [options], callback)
方法讀取文件。
readFile接收三個參數(shù),filename是文件名;[options]是可選的參數(shù),為一個對象,用于指定文件編碼(encoding)及操作方式(flag);callback是回調(diào)函數(shù)。



在虛擬機家目錄(/home/shiyanlou)下新建一個文件text.txt,文件中的內(nèi)容如下:
<pre>
line one
line two
</pre>
使用readFile讀取此文件,虛擬機家目錄下新建文件readfile.js
,輸入如下代碼并保存:
<pre>
var fs = require('fs'); // 引入fs模塊

fs.readFile('./test.txt', function(err, data) {
// 讀取文件失敗/錯誤
if (err) {
throw err;
}
// 讀取文件成功
console.log(data);
});
</pre>
readFile的回調(diào)函數(shù)接收兩個參數(shù),err是讀取文件出錯時觸發(fā)的錯誤對象,data是從文件讀取的數(shù)據(jù)。
運行程序:
<pre>
shiyanlou:~/ $ node readfile.js
</pre>
會看到輸出的內(nèi)容類似于這樣:
<pre><Buffer 6c 69 6e 65 20 6f 6e 65 0a 6c 69 6e 65 20 74 77 6f 0a></pre>
這是原始二進制數(shù)據(jù)在緩沖區(qū)中的內(nèi)容。要顯示文件內(nèi)容可以使用toString()或者設置輸出編碼,readFile.js
可以改成這樣:

<pre>
var fs = require('fs'); // 引入fs模塊
// 使用toString()
fs.readFile('./test.txt', function(err, data) {
// 讀取文件失敗/錯誤
if (err) {
throw err;
}
// 讀取文件成功
console.log('toString: ', data.toString());
});
// 設置編碼格式
fs.readFile('./test.txt', 'utf-8', function(err, data) {
// 讀取文件失敗/錯誤
if (err) {
throw err;
}
// 讀取文件成功
console.log('utf-8: ', data.toString());
});
</pre>
這樣再運行程序就能正常顯示出文件中的內(nèi)容了。
fs.readFileSync(filename, [options])是readFile的同步方法。

三、writeFile寫入文件

使用fs.writeFile(filename, data, [options], callback)寫入內(nèi)容到文件。

 writeFile接收四個參數(shù),filename是文件名稱;data是要寫入文件的數(shù)據(jù);
[options]是一個對象為可選參數(shù),包含編碼格式(encoding),模式(mode)
以及操作方式(flag);callback是回調(diào)函數(shù)。
writeFile
writeFile

在虛擬機家目錄下新建writeFile.js文件,輸入如下代碼并保存:
<pre>
var fs = require('fs'); // 引入fs模塊

// 寫入文件內(nèi)容(如果文件不存在會創(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);
});
});</pre>
運行程序:
<pre>shiyanlou:~/ $ node writeFile.js</pre>
如果要追加數(shù)據(jù)到文件,可以傳遞一個flag參數(shù),修改代碼為如下所示:
<pre>
var fs = require('fs'); // 引入fs模塊

// 寫入文件內(nèi)容(如果文件不存在會創(chuàng)建一個文件)
// 傳遞了追加參數(shù) { 'flag': 'a' }
fs.writeFile('./test2.txt', 'test test', { 'flag': 'a' }, 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);
});
});
</pre>
運行程序:
<pre>shiyanlou:~/ $ node writeFile.js</pre>

   flag傳遞的值,
  r代表讀取文件,
  w代表寫入文件,
  a代表追加寫入文件,還有其他的值不作詳細介紹。

四、使用fs.read和fs.write讀寫文件

使用fs.read和fs.write.讀寫文件需要使用fs.open打開文件和fs.close關閉文件。

1、fs.read()

先介紹fs.open(path, flags, [mode], callback)方法,此方法用于打開文件,以便fs.read()讀取。

  • path是文件路徑
  • [mode]是文件的權限(可選參數(shù),默認值是0666)
  • callback是回調(diào)函數(shù)。
  • flags是打開文件的方式.flags的值:
  • -r:讀取文件,文件不存在時報錯;
  • r+:讀取并寫入文件,文件不存在時報錯;
  • rs:以同步方式讀取文件,文件不存在時報錯;
  • rs+:以同步方式讀取并寫入文件,文件不存在時報錯;
  • w:寫入文件,文件不存在則創(chuàng)建,存在則清空;
  • wx:和w一樣,但是文件存在時會報錯;
  • w+:讀取并寫入文件,文件不存在則創(chuàng)建,存在則清空;
  • wx+:和w+一樣,但是文件存在時會報錯;
  • a:以追加方式寫入文件,文件不存在則創(chuàng)建;
  • ax:和a一樣,但是文件存在時會報錯;
  • a+:讀取并追加寫入文件,文件不存在則創(chuàng)建;
  • ax+:和a+一樣,但是文件存在時會報錯。

2.fs.close(fd, [callback])

用于關閉文件,fd是所打開文件的文件描述符。
fs.read(fd, buffer, offset, length, position, callback)
方法接收6個參數(shù)。

  • fd是文件描述符,必須接收fs.open()方法中的回調(diào)函數(shù)返回的第二個參數(shù);
  • buffer是存放讀取到的數(shù)據(jù)的Buffer對象;
  • offset指定向buffer中存放數(shù)據(jù)的起始位置;
  • length指定讀取文件中數(shù)據(jù)的字節(jié)數(shù);
  • position指定在文件中讀取文件內(nèi)容的起始位置;
  • callback是回調(diào)函數(shù),回調(diào)函數(shù)的參數(shù):
  • err用于拋出異常;
  • bytesRead是從文件中讀取內(nèi)容的實際字節(jié)數(shù);
  • buffer是被讀取的緩存區(qū)對象。

在家目錄中新建文件testread.txt,在文件中隨意輸入一些內(nèi)容,然后新建read.js文件,
輸入如下代碼并保存:
<pre>
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);
});
});
</pre>
運行程序:
<pre>shiyanlou:~/ $ node read.js</pre>

3、fs.write()

fs.write(fd, buffer, offset, length, position, callback)方法的參數(shù)和fs.read()相同,
buffer是需要寫入文件的內(nèi)容。

在家目錄中新建文件testwrite.txt,然后新建write.js文件,輸入如下代碼并保存:
<pre>
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, written, buffer) {
if (err) {
throw err;
}
console.log('write success.');
// 打印出buffer中存入的數(shù)據(jù)
var byteLength = buffer.byteLength;
console.log(byteLength, buffer.slice(0, byteLength).toString());
// 關閉文件
fs.close(fd);
});
});
</pre>
運行程序:
<pre>shiyanlou:~/ $ node write.js</pre>

五、目錄操作

1、創(chuàng)建目錄

使用fs.mkdir(path, [mode], callback)創(chuàng)建目錄,

  • path是需要創(chuàng)建的目錄,
  • [mode]是目錄的權限(默認值是0777),
  • callback 是回調(diào)函數(shù)。

在家目錄下創(chuàng)建mkdir.js文件,輸入如下代碼并保存:
<pre>
var fs = require('fs'); // 引入fs模塊
// 創(chuàng)建 newdir 目錄
fs.mkdir('./newdir', function(err) {
if (err) {
throw err;
}
console.log('make dir success.');
});
</pre>
運行代碼:
<pre>shiyanlou:~/ $ node mkdir.js</pre>
運行程序后會發(fā)現(xiàn)在當前目錄下已經(jīng)創(chuàng)建了newdir目錄,刪除目錄可以使用fs.rmdir(path, callback),但是只能刪除空目錄。

2、讀取目錄

使用fs.readdir(path, callback)讀取文件目錄。
在家目錄下新建readdir.js文件,輸入如下代碼并保存:
<pre>
var fs = require('fs'); // 引入fs模塊
fs.readdir('./newdir', function(err, files) {
if (err) {
throw err;
}
// files是一個數(shù)組
// 每個元素是此目錄下的文件或文件夾的名稱
console.log(files);
});
</pre>
運行代碼:
<pre>shiyanlou:~/ $ node readdir.js</pre>

六、結束

fs模塊中還有很多其他方法,其使用與前面介紹的方法類似,在此不一一介紹,可自行查閱官方API文檔。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容