2012-08-14 12 views
9

ho usato il file di scrittura con nodejs in due fasi:Confuso su file di sistema node.js

1.First giudice se il file è esiste o non, utilizzare la funzione fs.exists;

2. Quindi utilizzare fs.writeFile per scrivere direttamente il file;

Ma ora ho notato che ci sono più funzioni utilizzate per il file di scrittura, come fs.open o fs.close, dovrei usarle per aprire o chiudere il file durante la scrittura?

Inoltre, ho notato che hanno fs.createReadStream e fs.createWriteStream funzione, qual è la differenza tra loro e fs.writeFile e fs.readFile?

risposta

29

Ecco come vorrei spiegare le differenze:

di basso livello:

fs.open e fs.close lavoro su descrittori di file. Queste sono funzioni di basso livello e rappresentano le chiamate di mappa alle chiamate di sistema BSD open(2). Come avrai un descrittore di file, staresti usando questi con fs.read o fs.write.

nota, tutti questi sono asincroni e non ci sono versioni sincrone così: fs.openSync, fs.closeSync, fs.readSync, fs.writeSync, dove si sarebbe non utilizzare un callback. La differenza tra le versioni asincrona e sincrona è che fs.openSync restituisce solo quando l'operazione di apertura del file è stata completata, mentre fs.open restituisce immediatamente e si utilizzerà il descrittore di file nella richiamata.

Queste funzioni di basso livello ti danno pieno controllo, ma significano molto più codifica.

di livello medio:

fs.createReadStream e fs.createWriteStream creano oggetti stream che è possibile cablare agli eventi. Gli esempi per questi eventi sono "dati" (quando una porzione di dati è stata letta, ma quel blocco è solo una parte del file) o "chiuso". I vantaggi di questo sono che è possibile leggere un file ed elaborarlo mentre i dati arrivano, cioè non è necessario leggere l'intero file, tenerlo in memoria e quindi elaborarlo. Ciò ha senso quando si ha a che fare con file di grandi dimensioni in quanto è possibile ottenere prestazioni migliori nell'elaborazione di bit in blocchi piuttosto che occuparsi dell'intero file (ad esempio, un intero file da 1 GB in memoria).

Alto livello:

fs.readFile e fs.writeFile operare su tutto il file. Quindi chiamereste fs.readFile, il nodo leggerà l'intero file e quindi vi presenterà l'intero dato nel vostro callback. Il vantaggio di questo è che non è necessario gestire blocchi di dimensioni diverse (come quando si usano gli stream). Durante la scrittura, il nodo scriverebbe l'intero file. Lo svantaggio di questo approccio è che durante la lettura/scrittura, si dovrebbe avere l'intero file in memoria. Ad esempio, se si sta trasformando un file di registro, potrebbero essere necessarie solo linee di dati, utilizzando i flussi è possibile farlo senza dover attendere che il file venga letto completamente prima di iniziare a scrivere.

Ci sono anche, fs.readFileSync e fs.writeFileSync che non utilizzano una richiamata, ma attendere che la lettura/scrittura finisca prima di tornare. Il vantaggio di utilizzare questo è che per un file di piccole dimensioni, non si può voler fare nulla prima che il file ritorni, ma per i file di grandi dimensioni significherebbe che la CPU sarebbe inattiva via in attesa che l'I/O del file finisse.

La speranza che ha senso e in risposta alla tua domanda, quando si utilizza fs.writeFile non è necessario fs.open o fs.close.