2012-08-14 19 views
9

Solía ​​archivo de escritura con nodejs en dos pasos:Confundido sobre el sistema de archivos Node.js

juez 1.En primer lugar si el archivo es o no existe, utilice la función fs.exists;

2.A continuación, use fs.writeFile para escribir el archivo directamente;

Pero ahora he notado que hay más funciones para escribir el archivo, como fs.open o fs.close, ¿debo utilizarlas para abrir o cerrar el archivo mientras escribo?

Además, me di cuenta de que tienen fs.createReadStream y fs.createWriteStream función, lo que las diferencias entre ellos y fs.writeFile y fs.readFile?

Respuesta

29

Así es como me gustaría explicar las diferencias:

de bajo nivel:

fs.open y fs.close trabajo sobre los descriptores de fichero. Estas son funciones de bajo nivel y representan llamadas de mapa a open(2) llamadas al sistema BSD. Como tendrá un descriptor de archivo, los usará con fs.read o fs.write.

en cuenta que todos estos son asíncronos y síncronos hay versiones así: fs.openSync, fs.closeSync, fs.readSync, fs.writeSync, donde usted no utilizar una devolución de llamada. La diferencia entre las versiones asíncrona y síncrona es que fs.openSync solo se devolverá cuando se complete la operación para abrir el archivo, mientras que fs.open lo devolverá inmediatamente y utilizará el descriptor de archivo en la devolución de llamada.

Estas funciones de bajo nivel le dan un control total, pero significará mucha más codificación.

Nivel de mediana:

fs.createReadStream y fs.createWriteStream crear objetos de flujo que se puede cablear hasta eventos. Los ejemplos de estos eventos son 'datos' (cuando se ha leído un fragmento de datos, pero ese fragmento es solo parte del archivo) o 'cerrado'. Las ventajas de esto son que puede leer un archivo y procesarlo a medida que ingresan los datos, es decir, no tiene que leer todo el archivo, guardarlo en la memoria y luego procesarlo. Esto tiene sentido cuando se trata de archivos grandes, ya que se puede obtener un mejor rendimiento en el procesamiento de bits en fragmentos en lugar de tratar con todo el archivo (por ejemplo, un archivo de 1 GB completo en la memoria).

nivel alto:

fs.readFile y fs.writeFile operan en todo el archivo. Entonces llamarías al fs.readFile, el nodo leería todo el archivo y luego te presentaría toda la información en tu devolución de llamada. La ventaja de esto es que no necesita lidiar con fragmentos de diferentes tamaños (como cuando se utilizan flujos). Al escribir, el nodo escribiría el archivo completo. La desventaja de este enfoque es que cuando lee/escribe, debe tener todo el archivo en la memoria. Por ejemplo, si está transformando un archivo de registro, es posible que solo necesite líneas de datos, con las secuencias puede hacerlo sin tener que esperar a que el archivo se lea por completo antes de comenzar a escribir.

También hay, fs.readFileSync y fs.writeFileSync que no usarían una devolución de llamada, pero espere a que la lectura/escritura termine antes de regresar. La ventaja de utilizar esto es que para un archivo pequeño, es posible que no desee hacer nada antes de que el archivo regrese, pero para archivos grandes significaría que la CPU se apagará mientras espera que termine la E/S de archivos.

Espero que tenga sentido y en respuesta a su pregunta, al usar fs.writeFile no necesita fs.open o fs.close.

Cuestiones relacionadas