2012-12-18 30 views

回答

7

tell不是,但它是相當罕見的還不知道在一個文件中,你所在的位置,或者沒有辦法來跟蹤自己。

seek通過fs.readfs.write的參數position間接暴露。當給出時,論證將在執行其操作之前尋求該位置,並且如果null,它將使用它以前的任何位置。

+1

我使用'tell'的時間大多是當我在逐行讀取平臺不可知的代碼中的文本時,這些代碼可能以'\ n','\ r'(不再普通)或'\ r' r \ N'。儘管如此,仍然有可能在沒有「告訴」的情況下追蹤位置。 – hippietrail

+0

爲了可能讀取此線程的其他人的利益,我錯過了'position'參數,因爲在閱讀文檔時,我設法將它與'offset'參數混合起來,這個參數是緩衝區開始處的偏移量想要將數據讀入。 – hippietrail

+0

這對於從二進制文件讀取記錄非常適用,但我也需要從傳遞的文件偏移量中讀取文本行。由於「Buffer」的性質以及需要將其轉換爲編碼文本(如UTF-8),使用'fs.read'讀取單行文本非常困難。由於UTF-8包含多字節字符,顯而易見的方式會導致字符被破壞。 'ReadableStream'處理多字節字符,但不允許自由尋找。我不確定是否有任何圖書館可以讓您將隨機訪問和在線閱讀相結合。 – hippietrail

2

節點沒有這些內置的,你可以得到最接近的是使用fs.createReadStreamstart參數來啓動從偏移讀取,(通過在現有fd以避免重新打開文件)。

http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options

+0

除非事實證明這很慢,它似乎是一個完美的解決方案。它可能取決於從fd創建ReadStream的成本。 – hippietrail

+0

每次我再次調用'createReadStream()'時,是否還需要傳入相同的路徑參數? 'path'是強制性的,而'fd'只是可選的,文檔不清晰。 – hippietrail

+0

嗯......你有沒有嘗試傳遞'null'的路徑,即使它說它是必需的?否則我只是通過相同的路徑。 – yiding

1

我想createReadStream反覆創建新的文件描述符。我更喜歡同步版本:

function FileBuffer(path) { 
const fd = fs.openSync(path, 'r'); 

function slice(start, end) { 
    const chunkSize = end - start; 
    const buffer = new Buffer(chunkSize); 

    fs.readSync(fd, buffer, 0, chunkSize, start); 

    return buffer; 
} 

function close() { 
    fs.close(fd); 
} 

return { 
    slice, 
    close 
} 

}