2012-12-18 22 views

risposta

7

tell non è, ma è piuttosto raro di non già conoscere la posizione ci si trova in un file, o di non avere un modo per tenere traccia da soli.

seek è esposto indirettamente tramite l'argomento position di fs.read e fs.write. Quando viene specificato, l'argomento cercherà quella posizione prima di eseguire la sua operazione e, se null, utilizzerà qualsiasi posizione precedente.

+1

Le volte che uso 'tell' sono soprattutto quando sto leggendo il testo in codice indipendente dalla piattaforma riga per riga che potrebbe avere linee che finiscono in' \ n', '\ r' (non più comune) o' \ r \ n '. È certamente ancora possibile tracciare la posizione senza 'tell' però. – hippietrail

+0

Per il beneficio di chiunque altro possa leggere questo thread, ho perso il parametro 'position' perché nella mia lettura dei documenti sono riuscito a confilarlo con il parametro' offset', che è l'offset dall'inizio del buffer voglio leggere i dati in. – hippietrail

+0

Funziona perfettamente per la lettura di record da file binari, ma ho anche bisogno di leggere righe di testo dagli offset di file passati. Risulta molto difficile leggere una singola riga di testo usando 'fs.read' a causa della natura di' Buffer' e della necessità di convertire tali testi in testo codificato come UTF-8. I modi ovvi risultano in caratteri non funzionanti poiché UTF-8 include caratteri multibyte. 'ReadableStream' gestisce i caratteri multibyte, ma non consente di cercare liberamente. Non sono sicuro che ci sia una libreria che ti permetta di combinare l'accesso casuale e la lettura della linea. – hippietrail

2

nodo non ha questi costruiti in, il più vicino è possibile ottenere è quello di utilizzare fs.createReadStream con un parametro start per iniziare a leggere da un offset, (passare in un fd esistente per evitare la ri-apertura del file).

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

+0

A meno che questo non sia lento, sembra una soluzione perfetta. Potrebbe dipendere dal costo della creazione di un ReadStream da un fd. – hippietrail

+0

Devo anche passare lo stesso parametro del percorso ogni volta che chiamo 'createReadStream()' di nuovo? Il 'percorso' è obbligatorio mentre' fd' è solo opzionale e i documenti non sono chiari. – hippietrail

+0

hm ... hai provato a passare in 'null' per il percorso, anche se dice che è richiesto? altrimenti passerei semplicemente nello stesso percorso. – yiding

1

Suppongo che createReadStream crei continuamente un nuovo descrittore di file. Io preferisco la versione di sincronizzazione:

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 
} 

}