2012-12-18 22 views

Antwort

7

tell ist nicht, aber es ist ziemlich selten die Position nicht bereits wissen Sie in einer Datei sind oder nicht, einen Weg zu haben, um sich selbst zu verfolgen.

seek wird indirekt über das position Argument von fs.read und fs.write ausgesetzt. Wenn es angegeben wird, sucht das Argument an diesem Ort, bevor es seine Operation ausführt, und wenn null verwendet wird, wird es die vorherige Position verwenden, die es hatte.

+1

Die Zeiten, die ich 'tell' benutze, sind meistens, wenn ich Text in plattformunabhängigem Code zeilenweise lese, der Zeilen haben kann, die entweder mit' \ n' enden, '\ r' (nicht mehr üblich), oder' \ r \ n'. Es ist sicherlich immer noch möglich, die Position zu verfolgen, ohne "sagen" zu müssen. – hippietrail

+0

Für alle anderen, die diesen Thread lesen könnten, habe ich den Parameter 'position' vermisst, weil ich ihn beim Lesen der Dokumente mit dem 'offset'-Parameter zusammengeführt habe, welcher der Offset vom Anfang des Puffers ist möchte Daten in lesen. – hippietrail

+0

Dies funktioniert hervorragend zum Lesen von Datensätzen aus Binärdateien, aber ich muss auch Textzeilen aus übergebenen Dateioffsets lesen. Es erweist sich als sehr schwierig, eine einzelne Textzeile mit 'fs.read' zu lesen, da' Buffer' verwendet wird und diese in kodierten Text wie UTF-8 konvertiert werden müssen. Die offensichtlichen Wege führen zu gebrochenen Zeichen, da UTF-8 Multibyte-Zeichen enthält. 'ReadableStream' behandelt Multibyte-Zeichen, ermöglicht jedoch keine freie Suche. Ich bin mir nicht sicher, ob es eine Bibliothek gibt, mit der man wahlfreien Zugriff und Zeilenlesen kombinieren kann. – hippietrail

2

Knoten nicht diese hat eingebaut, die nächstgelegene Sie ist erhalten können fs.createReadStream mit einem start Parameter zu verwenden, um von einem Offset zu lesen zu beginnen, (mit der in einem bestehenden fd Wieder Öffnen der Datei zu vermeiden).

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

+0

Wenn es sich nicht langsam herausstellt, scheint es wie eine perfekte Lösung. Es könnte von den Kosten für das Erstellen eines ReadStream von einem fd abhängen. – hippietrail

+0

Muss ich auch bei jedem erneuten Aufruf von 'createReadStream()' den gleichen Pfadparameter übergeben? Der "Pfad" ist obligatorisch, während der "fd" nur optional ist und die Dokumente nicht klar sind. – hippietrail

+0

hm ... haben Sie versucht, "Null" für Pfad zu übergeben, obwohl es sagt, dass es erforderlich ist? sonst würde ich einfach den gleichen Weg gehen. – yiding

1

Ich nehme an, createReadStream erstellt immer wieder neue Dateideskriptoren. Ich ziehe es sync Version:

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 
} 

}