Node.js selbst bietet keine API für direktes Kopieren von Dateien. Wenn Sie Dateien oder Verzeichnisse mit node.js kopieren möchten, müssen Sie andere APIs verwenden, um sie zu implementieren. Sie können ReadFile und WriteFile direkt verwenden, um eine einzelne Datei zu kopieren, was einfacher ist. Wenn Sie alle Dateien in einem Verzeichnis kopieren und das Verzeichnis möglicherweise auch Unterverzeichnisse enthalten, müssen Sie eine fortgeschrittenere API verwenden.
fließen
Streams sind die Art und Weise, wie Node.js Daten verschieben. Streams in node.js sind lesbar/beschreibbar, und sowohl HTTP- als auch Dateisystemmodule verwenden Streams. Im Dateisystem wird bei Streams zum Lesen von Dateien möglicherweise nicht sofort eine große Datei gelesen, sondern mehrmals gelesen. Beim Lesen reagiert es auf Datenereignisse. Sie können mit den Lesedaten arbeiten, bevor die Datei gelesen wird. In ähnlicher Weise werden beim Schreiben in einen Stream große Dateien nicht gleichzeitig geschrieben, genau wie beim Lesen. Diese Art der Verschiebung von Daten ist sehr effizient, insbesondere für große Dateien. Die Verwendung von Streams ist viel schneller als darauf zu warten, dass alle großen Dateien vor dem Betrieb der Dateien gelesen werden.
Pipeline
Wenn Sie beim Lesen und Schreiben von Streams die vollständige Kontrolle haben möchten, können Sie Datenereignisse verwenden. Für die einfache Dateireplikation können Streams und Schreiben von Streams jedoch Daten über Pipelines übertragen.
Praktische Anwendung:
Die Codekopie lautet wie folgt:
var fs = erfordern ('fs'),
stat = fs.Stat;
/*
* Kopieren Sie alle Dateien im Verzeichnis einschließlich Unterverzeichnissen
* @param {String} Verzeichnis, das kopiert werden muss
* @param {String} in das angegebene Verzeichnis kopieren
*/
var Copy = Funktion (SRC, DST) {
// Lesen Sie alle Dateien/Verzeichnisse im Verzeichnis
fs.readdir (src, function (err, paths) {
if (err) {
errösten;
}
paths.foreach (Funktion (Pfad) {
var _src = src + '/' + Pfad,
_dst = dst + '/' + Pfad,
lesbar, beschreibbar;
stat (_src, function (err, st) {
if (err) {
errösten;
}
// Bestimmen Sie, ob es sich um eine Datei handelt
if (St.Isfile ()) {
// Erstellen Sie einen Lesestream
lesbar = fs.createadStream (_src);
// Erstellen Sie einen Schreibstream
schriftlich = fs.createwritestream (_dst);
// Ströme über Pipelines übertragen
lesbar.pipe (beschreibbar);
}
// Wenn es sich um ein Verzeichnis handelt, nennen Sie sich selbst rekursiv
sonst if (st.isdirectory ()) {
existiert (_src, _dst, kopieren);
}
});
});
});
};
// Vor dem Kopieren des Verzeichnisses müssen Sie feststellen, ob das Verzeichnis existiert. Wenn es nicht existiert, müssen Sie zuerst ein Verzeichnis erstellen.
var exists = Funktion (SRC, DST, Callback) {
fs. existiert (dst, function (existiert) {
// existiert bereits
if (existiert) {
Rückruf (SRC, DST);
}
// existiert nicht
anders{
fs.mkdir (dst, function () {
Rückruf (SRC, DST);
});
}
});
};
// das Verzeichnis kopieren
existiert ('./src', './build', kopieren);