Estoy tratando de leer un archivo binario byte por byte en Node usando fs.open y FileHandle . Usando FileHandle.read(buffer, offset, length, position) , puedo:
position en blanco, en cuyo caso cada porción de datos leídos mueve la posición interna de FileHandleposition , en cuyo caso la posición interna permanecerá sin cambios Me gustaría leer un valor desde una posición específica en el medio del archivo (usando FileHandle.read con una posición) y, en función de ese valor, leer secuencialmente algunos otros datos desde otro punto del archivo (usando FileHandle.read con sin puesto).
La primera parte es fácil. Para la segunda parte, sé que puedo:
readLa primera solución es factible pero un poco complicada, ya que la estructura de esos datos es bastante complicada. La segunda solución no es realmente viable ya que los archivos se vuelven bastante grandes, y el objetivo de leer el archivo byte por byte era no leer grandes porciones de su contenido en la memoria.
También puedo construir mi propia abstracción sobre FileHandle , una que mantendría su propia posición interna y me permitiría modificarla, pero prefiero evitarlo si puedo.
¿Hay algún método que me permita omitir una cantidad arbitraria de bytes en un FileHandle o configurar manualmente su posición interna?
La biblioteca fs toma una estrategia de no intervención con la posición del archivo, dejando que libuv y el sistema operativo se encarguen de eso por completo. Por lo tanto, no hay una posición guardada en el objeto FileHandle.
Puede ver el código relevante aquí donde simplemente hace esto:
position = bufferOrOptions.position || null; y simplemente pasa esa variable de position directamente a través de los enlaces de código nativo:
const bytesRead = (await binding.read(handle.fd, buffer, offset, length, position, kUsePromises)) || 0; Por lo tanto, el módulo fs en sí mismo no realiza un seguimiento de la posición del archivo y, por lo tanto, no puede "configurarlo" en el módulo fs . Además de piratear las partes internas de nodejs, no conozco otra forma de "establecer" la posición del archivo que no sea su propia sugerencia de anular varios métodos para realizar un seguimiento de la posición del archivo "actual" y luego poder configurar ese archivo position al valor "actual" antes de que proceda cualquier llamada a la API que no haya pasado explícitamente en la posición del archivo.
Viniendo de C ++, donde esto era una parte tan integrada de la biblioteca de archivos std, esto siempre me ha parecido extraño en nodejs que no hay provisión para ello. Parece que quizás libuv ni siquiera tenga una idea de la posición del archivo si observa las operaciones de archivo disponibles aquí , así que quizás esta es la razón por la cual nodejs hace lo mismo.
De todos modos, lo siento, no pude ofrecer ninguna respuesta mágica y simple, pero espero que esto explique el estado de las cosas a este respecto y pueda decidir cuál es la mejor manera de proceder.