node.js-fs
阿新 • • 發佈:2018-11-21
簡介
fs
模組是node.js
中的檔案操作模組。
- 匯入
const fs = require('fs');
- 非同步
fs.readFile('file.txt', function(err, data){
if(err){
console.log('something was wrong : ', err.toString());
return;
}
console.log('async read : ', data.toString());
})
readFile
:預設非同步方式處理,自定義回撥函式
callback
:雙入參,第一個err
錯誤資訊,後面的data
是讀取的資料。
- 同步
var content = fs.readFileSync('file.txt');
console.log('sync read : ', content);
readFileSync
:常用方式,無非同步
開篇簡介到此為止,接下來深入詳解。
狀態
const fs = require('fs');
fs.stat('file.txt', function(err, status){
if(err){
console.log('something was wrong : ', err.toString());
return;
}
console.log(status);
})
執行一下就知道是啥東西了,還有相關的狀態判斷;
方法 | 描述 |
---|---|
isFile |
是檔案否 |
isDirectoty |
是目錄否 |
isBlockDevice |
塊裝置否 |
isCharacterDevice |
字元裝置否 |
isSymbolicLink |
軟連結否 |
isFIFO |
FIFO 否 |
isSocket |
SOCKET 否 |
const fs = require('fs');
fs.stat('file.txt', function(err, status){
if(err){
console.log('something was wrong : ', err.toString());
}
if(status.isFile()){
console.log('this file is a file, not directory');
}else if(status.isDirectory()){
console.log('this file is a directory');
}else{
console.log('unknow file type');
}
})
寫入
const fs = require('fs');
fs.writeFile('file.txt', 'new content', function(err){
console.log('this is callback');
if(err){
console.log(err.toString());
return;
}
console.log('write successful');
})
和簡介
的例子相對應,這個更容易理解。
不過其中的file.txt
的位置,也可以是檔案描述符,後面會使用。
執行能夠發現,檔案內容每次都在覆蓋,這因為差了一些可選引數,
{encoding, mode, flag}
。
encoding
:指定編碼,預設utf-8
mode
:指定模式,預設0666
flag
:指定檔案模式,預設w
const fs = require('fs');
fs.writeFile('file.txt', 'append Conent', {'flag':'a'}, function(err){
if(err){
console.log(err);
return;
}
console.log('write success');
});
可選引數可有可無,即使
json
指定了,也不用全部設定。這下去看,應該是
append
的了。
開啟
前面都是文字檔案,接下來說一下檔案描述符。
const fs = require('fs');
fs.open('file.txt', 'r+', function(err, fd){
if(err){
console.log(err);
return;
}
console.log('open success');
})
再詳細複述一下檔案的模式
模式 | 描述 |
---|---|
r |
只讀模式,無則報錯 |
r+ |
讀寫模式,無則報錯 |
rs |
只讀模式,同步讀取 |
rs+ |
讀寫模式,同步操作 |
w |
只寫模式,無則建立 |
wx |
只寫模式,存在失敗 |
w+ |
讀寫模式,無則建立 |
wx+ |
讀寫模式,存在失敗 |
a |
追加模式,無則建立 |
ax |
追加模式,存在失敗 |
a+ |
讀寫追加,無則建立 |
ax+ |
讀寫追加,存在失敗 |
fs.open(path, flags[, mode], callback)
整體呼叫引數中,
mode
是可選引數,同linux
。
function callback(err, fd){
...
}
回撥函式兩個入參
err
:老相識
fd
:檔案描述符,後續加深
再讀
const fs = require('fs');
fs.open('file.txt', 'r', function(err, fd){
if(err){
console.log('something was wrong : ', err);
return;
}
fs.readFile(fd, function(err, data){
if(err){
console.log('fd error : ', err);
return;
}
console.log('content : ', data.toString());
})
})
隨便可以試,
filename
的地方都可以更換為fd
。但是,再操作的時候,讀寫屬性關鍵看
fd
的。const fs = require('fs'); fs.open('file.txt', 'w', function(err, fd){ if(err){ console.log('something was wrong : ', err); return; } fs.readFile(fd, function(err, data){ if(err){ console.log('fd error : ', err); return; } console.log('content : ', data.toString()); }) })
如果模式不對,就會報錯,這個時候就多關注一下
fd
的模式。
再寫
其實沒啥變化,就是
filename
替換為了fd
,不必再說。
非同步
- 讀取
const fs = require('fs'); var buffer = Buffer.alloc(1024); fs.open('file.txt', 'r', function(err, fd){ if(err){ return; } fs.read(fd, buffer, 0, buffer.length, 0, function(err, readLength){ if(err){ return; } console.log('read bytes length : ', readLength); console.log('read file content : ', buffer.slice(0, readLength).toString()); }) });
fs.read(fd, buffer, offset, length, position, callback)
offset
:buffer
的寫起始位置
length
:想要讀取的長度
position
:檔案開始讀取位置
callback
:回撥函式
callback(err, length, buffer)
err
:老東西
length
:已經讀取的長度
buffer
:讀取的buffer
- 擷取
const fs = require('fs'); var buffer = Buffer.alloc(1024); fs.open('file.txt', 'r+', function(err, fd){ if(err){ return; }; fs.ftruncate(fd, 5, function(err)){ if(err){ return; }; fs.read(fd, buffer, 0, buffer.length, 0, function(err, length, buf){ if(err){ return; } console.log('read content : ', buffer.slice(0, length).toString()); }); } })
擷取是真實的檔案修改,不是部分讀取,檔案內容會被截斷。
- 關閉
fs.close(fd, function(err){ if(err){ console.log('something was wrong : ', err); return; } console.log('file was closed !'); })
刪除
const fs = require('fs');
fs.unlink('file.txt', function(err){
if(err){
console.log('something was wrong : ', err);
return;
}
console.log('file was deleted !');
})
目錄
- 建立
const fs = require('fs');
fs.mkdir('./newDir', function(err){
if(err){
return;
}
console.log('mkdir over');
})
- 讀取
const fs = require('fs');
fs.readdir('.', function(err, files){
files.forEach(function(file){
console.log(file);
});
});
- 刪除
const fs = require('fs');
fs.rmdir('./dir', function(){
console.log('remove over');
});
更多
更多更全請參看官方文件。