本文同步自我的個人博客:http://www.52cik.com/2015/12/03/learn-node-fs.html
最近看到群里不少大神都開始玩 node 了,我感覺跟他們步伐越來越大了,
為了追逐他們的步伐,必須把 node 技能 get 起來。
hello world!
node 這貨,接觸也有快2年了吧,不過1年前才開始用,僅僅是用而已。
因為那時候接觸 grunt 以及后來的 gulp 然后漸漸的熟悉了 node。
當時的 node 官網,首頁就是一個簡單的 http 例子。
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');
當然現在也是這個例子,只是沒放首頁。
其實我當時是不感冒的,因為對於phper來說,。。。算了,不扯則個了。
反正當時只是為了用 grunt/gulp 而已,其他都無所謂。
入門
雖然之前也斷斷續續打算學,但是都沒用下決心,往往是看一下,就不看了。
以至於到現在連自己寫 gulp 都不會,只會各種復制黏貼。
這次是真的下決心學習了,哪怕慢慢學,也要堅持學習下去。
跟着網上教程走,第一篇是 process
的一些操作,我覺得除了 process.argv
獲取命令行參數, process.env
獲取環境變量,其他不太常用,至少我現階段用不到,所以只是簡單的測試了下,就直接到了 File System
部分。
fs 是文件操作,我之前寫爬蟲,以及最后的文件數據整理,都是 php 做的,現在學了 node 之后肯定盡量 node 上了。
下面我就簡單記錄下常用的方法,反正用法,中文文檔,百度上滿大街都是。
結合 File System
官網文檔來學習。
Sync 后綴方法
打開文檔發現每個方法都有兩個,其中有一個就多了個 Sync 后綴。
什么是同步異步,事件驅動,非阻塞I/O 這些學術性的東西我就不多說了,自行搜索,這里只說他們最明顯的區別。
比如 fs.rename
和 fs.renameSync
,前者是要傳入回調參數,當完成或遇到錯誤后會執行回調函數,而 Sync 同步方法,如果遇到錯誤了,直接拋出,導致js中斷。
fs.rename('123.txt', '321.txt', function (err) {
if (err) {
console.log(err); // 遇到錯誤
}
console.log('完成');
});
try {
fs.renameSync('123.txt', '321.txt');
console.log('完成');
} catch(err) {
console.log(err); // 遇到錯誤
}
就是這么個區別,一個和諧報錯,一個要手動 catch 錯誤信息。
文件讀寫
fs.read
, fs.write
和 fs.readFile
, fs.writeFile
, fs.appendFile
前者比較底層,需要結合 fs.open
打開文件得到文件句柄,然后基於文件句柄讀寫。
這不是很常用,所以直接說 fs.readFile
, fs.writeFile
, fs.appendFile
這三個方便的。
var fs = require('fs');
// 寫入數據, 文件不存在會自動創建
fs.writeFile('123.txt', 'Hello Node!', function (err) {
if (err) throw err;
console.log('寫入完成');
});
// 添加數據
fs.appendFile('123.txt', '添加數據,默認 utf8 格式', function (err) {
if (err) throw err;
console.log('添加完成');
});
// 讀取數據
fs.readFile('123.txt', function (err, data) {
if (err) throw err;
console.log(data.toString());
});
好了,簡潔明了,寫入,添加,讀取,都OK了。
不過我想大家也會跟我一樣會有個疑問,fs.readFile
是全部載入,那如果文件很大怎么破?
而且沒有按行讀取,很多情況下會很麻煩。
這個就之后 Stream 部分細說了。