Node.js lui-même ne fournit pas une API pour la copie directe des fichiers. Si vous souhaitez copier des fichiers ou des répertoires avec Node.js, vous devez utiliser d'autres API pour l'implémenter. Vous pouvez utiliser ReadFile et WriteFile directement pour copier un seul fichier, ce qui est plus facile. Si vous copiez tous les fichiers dans un répertoire et que le répertoire peut également contenir des sous-répertoires, vous devez utiliser une API plus avancée.
couler
Les flux sont la façon dont Node.js déplace les données. Les flux dans Node.js sont lisibles / écrivables, et les modules HTTP et System de fichiers utilisent des flux. Dans le système de fichiers, lors de l'utilisation de flux pour lire des fichiers, un grand fichier peut ne pas être lu en même temps, mais sera lu plusieurs fois. Lors de la lecture, il répondra aux événements de données. Vous pouvez fonctionner sur les données de lecture avant la lecture du fichier. De même, lors de l'écriture dans un flux, les fichiers volumineux ne sont pas écrits à un moment donné, tout comme lors de la lecture. Cette façon de déplacer les données est très efficace, en particulier pour les fichiers volumineux. L'utilisation de Streams est beaucoup plus rapide que d'attendre que tous les fichiers grands soient lus avant d'exploiter les fichiers.
pipeline
Si vous souhaitez avoir un contrôle complet lors de la lecture et de l'écriture de flux, vous pouvez utiliser des événements de données. Mais pour une réplication de fichiers simple, les flux de lecture et les flux d'écriture peuvent transférer des données via des pipelines.
Application pratique:
La copie de code est la suivante:
var fs = require ('fs'),
stat = fsat;
/ *
* Copiez tous les fichiers du répertoire, y compris les sous-répertoires
* @param {String} répertoire qui doit être copié
* @param {String} Copiez dans le répertoire spécifié
* /
var copy = function (src, dst) {
// Lire tous les fichiers / répertoires dans le répertoire
fs.readdir (src, fonction (err, paths) {
if (err) {
lancer err;
}
chemins.ForEach (fonction (chemin) {
var _src = src + '/' + chemin,
_dst = dst + '/' + chemin,
lisible, écrit;
stat (_src, fonction (err, st) {
if (err) {
lancer err;
}
// déterminer s'il s'agit d'un fichier
if (St.sisfile ()) {
// Créer un flux de lecture
lisible = fs.creareAdStream (_src);
// Créer un flux d'écriture
writeable = fs.CreateWRiteStream (_dst);
// transférer des flux à travers des pipelines
LEIS-SUPPIRATION (Écrivable);
}
// S'il s'agit d'un répertoire, appelez-le récursivement
else if (St.isDirectory ()) {
existant (_src, _dst, copie);
}
});
});
});
};
// Avant de copier le répertoire, vous devez déterminer si le répertoire existe. S'il n'existe pas, vous devez d'abord créer un répertoire.
var exists = fonction (src, dst, rappel) {
fs.exists (dst, fonction (existe) {
// existe déjà
if (existe) {
rappel (SRC, DST);
}
// n'existe pas
autre{
fs.mkdir (dst, function () {
rappel (SRC, DST);
});
}
});
};
// Copiez le répertoire
existant ('./src', './build', copie);