2017-03-04 40 views
0

我通過fs.appendFileSync()將字符串附加到文件,然後我想從該文件中獲取該字符串。我嘗試使用fs.readSync。但它返回Error: Unknown encoding: 6。如何從Node.js中的文件中獲取附加的字符串?我知道字符串的大小。 我對附加代碼:從Node.js中的文件末尾讀取確定的字符串大小

fs.appendFileSync('A.dmg','behdad'); 

和閱讀所附的字符串:

var fd = fs.openSync('A.dmg','w+'); 
var buffer = ''; 
var res = fs.readSync(fd,buffer,0,6,fs.statSync('A.dmg').size); 
console.log(buffer); 
console.log(res); 

編輯:

var fs = require('fs'); 
var fd = fs.openSync('A.dmg','r+'); 
var size = fs.statSync('A.dmg').size; 
var buffer = Buffer.alloc(size); 
var res = fs.readSync(fd, buffer, 0, size, 0); 
console.log(buffer.toString()); 
console.log(res); 

回答

1

首先,要明白r+w+模式之間的區別:

r+:打開一個文本文件進行更新(即對於讀取和寫入 )。
w+:打開文本文件進行更新(讀取和寫入), 首先將文件截斷爲零(如果存在)或創建 文件(如果文件不存在)。

由於您想打開文件進行閱讀並稍後更新,因此應該在r+模式下打開該文件。

其次,在代碼中傳遞給fs.readSync()的最後一個參數對我來說沒有意義。最後一個參數是position。如果你真的想讀6個字符,那麼爲什麼要指定文件指針的位置爲6?你想從頭開始閱讀文件,對吧?

現在回到主要觀點:代碼中傳遞給readSync()的第二個參數是數據類型:String,它是不可變的。所以,現在的呼叫fs.readSync()回落到舊的語法...

fs.readSync(fd, length, position, encoding):中fs.read同步版本。返回數組[data, bytesRead]

...它認爲6是你想指定的編碼,顯然不是這種情況。如果您使用的是舊版本的節點

var fs = require('fs'); 
fs.appendFileSync('A.dmg','behdad'); 
var fd = fs.openSync('A.dmg','r+'); 
var size = fs.statSync('A.dmg').size; 
var buffer = Buffer.alloc(size); 
var res = fs.readSync(fd, buffer, 0, size, 0); 
console.log(buffer.toString()); 
console.log(res); 

var fs = require('fs'); 
fs.appendFileSync('A.dmg','behdad'); 
var fd = fs.openSync('A.dmg','r+'); 
var size = fs.statSync('A.dmg').size; 
var res = fs.readSync(fd, size, 0, 'utf8'); 
console.log(res); 

閱讀討論

因此,如果您正在使用節點的新版本,你的代碼應該是這樣的在https://github.com/nodejs/node/issues/2820

+0

它在第二行返回一個空字符串和'0'。我想閱讀附加文本,我使用這種方式爲我的文件分配一個唯一的文本,然後閱讀該文件以識別文件。感謝您的信息。 –

+0

@BehdadAhmadi您是否將模式更改爲'r +'? –

+0

是的,但它返回空字符串。 –