2012-08-14 7 views
9

je fichier d'écriture avec nodejs en deux étapes:Confused sur le système de fichiers Node.js

juge 1.Premièrement si le fichier est existe ou non, utilisez la fonction fs.exists;

2.Utiliser ensuite fs.writeFile pour écrire directement le fichier;

Mais maintenant, j'ai remarqué qu'il y a plus de fonctions utilisées pour le fichier d'écriture, comme fs.open ou fs.close, devrais-je les utiliser pour ouvrir ou fermer un fichier pendant l'écriture?

D'ailleurs, je remarqué qu'il y a fs.createReadStream et fs.createWriteStream fonction, ce sont les différences entre eux et fs.writeFile et fs.readFile?

Répondre

29

Voilà comment j'expliquer les différences:

bas niveau:

fs.open et fs.close travail sur les descripteurs de fichiers. Ce sont des fonctions de bas niveau et représentent des appels de carte aux appels système BSD open(2). Comme vous aurez un descripteur de fichier, vous utiliserez ceux-ci avec fs.read ou fs.write.

Remarque, tous ces sont asynchrones et il existe des versions synchrones ainsi: fs.openSync, fs.closeSync, fs.readSync, fs.writeSync, où vous ne seriez pas utiliser un rappel. La différence entre les versions asynchrones et synchrones est que fs.openSync ne retournera que lorsque l'opération d'ouverture du fichier sera terminée, tandis que fs.open retournera immédiatement et que vous utiliserez le descripteur de fichier dans le rappel.

Ces fonctions de bas niveau vous offrent un contrôle total, mais elles nécessitent beaucoup plus de codage.

Niveau moyen:

fs.createReadStream et fs.createWriteStream créer des objets de flux que vous pouvez câbler aux événements. Les exemples de ces événements sont 'data' (quand un morceau de données a été lu, mais ce morceau n'est qu'une partie du fichier) ou 'close'. Les avantages sont que vous pouvez lire un fichier et le traiter au fur et à mesure que les données arrivent, c'est-à-dire que vous n'avez pas besoin de lire le fichier entier, de le garder en mémoire et de le traiter ensuite. Cela a du sens lorsque vous manipulez des fichiers volumineux, car vous pouvez obtenir de meilleures performances dans le traitement des bits en morceaux plutôt que de traiter le fichier entier (par exemple, un fichier entier de 1 Go en mémoire).

Niveau élevé:

fs.readFile et fs.writeFile fonctionnent dans tout le fichier. Donc vous appelez fs.readFile, le noeud lirait dans le fichier entier et vous présenterait alors toutes les données dans votre callback. L'avantage de ceci est que vous n'avez pas besoin de traiter des morceaux de tailles différentes (comme lorsque vous utilisez des flux). Lors de l'écriture, le noeud écrirait le fichier entier. L'inconvénient de cette approche est que lors de la lecture/écriture, vous devez avoir le fichier entier en mémoire. Par exemple, si vous transformez un fichier journal, il se peut que vous n'ayez besoin que de lignes de données, en utilisant les flux, vous pouvez le faire sans avoir à attendre que le fichier soit entièrement lu avant de commencer à écrire.

Il existe également fs.readFileSync et fs.writeFileSync qui n'utiliseraient pas de rappel, mais attendraient que la lecture/écriture se termine avant de retourner. L'avantage d'utiliser ceci est que pour un petit fichier, vous ne voudrez peut-être rien faire avant que le fichier ne retourne, mais pour les gros fichiers, cela signifierait que le CPU s'interrompre en attendant la fin de l'E/S du fichier.

Espérons que cela a du sens et en réponse à votre question, lorsque vous utilisez fs.writeFile vous n'avez pas besoin fs.open ou fs.close.

Questions connexes