Ich habe an Node.js herumgebastelt und ein kleines Problem gefunden. Ich habe ein Skript, das sich in einem Verzeichnis namens befindet data
. Ich möchte, dass das Skript einige Daten in eine Datei in einem Unterverzeichnis innerhalb des data
Unterverzeichnisses schreibt . Ich erhalte jedoch den folgenden Fehler:
{ [Error: ENOENT, open 'D:\data\tmp\test.txt'] errno: 34, code: 'ENOENT', path: 'D:\\data\\tmp\\test.txt' }
Der Code lautet wie folgt:
var fs = require('fs');
fs.writeFile("tmp/test.txt", "Hey there!", function(err) {
if(err) {
console.log(err);
} else {
console.log("The file was saved!");
}
});
Kann mir jemand helfen, herauszufinden, wie Node.js die Verzeichnisstruktur erstellen kann, wenn sie nicht zum Schreiben in eine Datei beendet wird?
javascript
node.js
Hirvesh
quelle
quelle
fs.promises.mkdir(path.dirname("tmp/test.txt"), {recursive: true}).then(x => fs.promises.writeFile("tmp/test.txt", "Hey there!"))
Antworten:
Knoten> 10.12.0
fs.mkdir akzeptiert jetzt eine
{ recursive: true }
Option wie folgt :oder mit einem Versprechen:
Knoten <= 10.11.0
Sie können dies mit einem Paket wie mkdirp oder fs-extra lösen . Wenn Sie kein Paket installieren möchten, lesen Sie bitte die Antwort von Tiago Peres França unten.
quelle
fs.promises
noch experimentell ist nodejs.org/dist/latest-v10.x/docs/api/…Wenn Sie kein zusätzliches Paket verwenden möchten, können Sie vor dem Erstellen Ihrer Datei die folgende Funktion aufrufen:
quelle
statSync
anstelle von verwendet werdenexistsSync
, basierend auf stackoverflow.com/questions/4482686/…path
ist auch ein Paket, das genauso benötigt werden mussfs
:var path = require('path')
falls sich jemand wundert. Siehe Knotendokumentation .fs.existsSync
ist nicht veraltet , nurfs.exists
ist.Mit node-fs-extra können Sie dies problemlos tun.
Es installieren
Verwenden Sie dann die
outputFile
Methode. Die Dokumentation lautet:Sie können es auf drei Arten verwenden:
Rückrufstil
Versprechen verwenden
Wenn Sie Versprechen verwenden , und ich hoffe es, ist dies der Code:
Version synchronisieren
Wenn Sie eine Synchronisierungsversion wünschen, verwenden Sie einfach diesen Code:
Eine vollständige Referenz finden Sie in der
outputFile
Dokumentation und in allen von node-fs-extra unterstützten Methoden .quelle
Schamloser Plug-Alarm!
Sie müssen nach jedem Verzeichnis in der gewünschten Pfadstruktur suchen und es manuell erstellen, wenn es nicht vorhanden ist. Alle Tools dafür sind bereits im fs-Modul von Node vorhanden, aber Sie können dies alles einfach mit meinem mkpath-Modul tun: https://github.com/jrajav/mkpath
quelle
Da ich noch keinen Kommentar abgeben kann, veröffentliche ich eine erweiterte Antwort basierend auf der fantastischen Lösung @ tiago-peres-frança (danke!). Sein Code erstellt kein Verzeichnis in einem Fall, in dem nur das letzte Verzeichnis im Pfad fehlt, z. B. lautet die Eingabe "C: / test / abc" und "C: / test" ist bereits vorhanden. Hier ist ein Ausschnitt, der funktioniert:
quelle
abc
wird dies als die Datei interpretiert, für die Sie ein Verzeichnis erstellen müssen. Um auch dasabc
Verzeichnis zu erstellen , fügen Sie Ihrem Pfad eine Dummy-Datei hinzu, zC:/test/abc/dummy.txt
.fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Mein Rat ist: Versuchen Sie, sich nicht auf Abhängigkeiten zu verlassen, wenn Sie dies mit wenigen Codezeilen problemlos tun können
Folgendes möchten Sie in 14 Codezeilen erreichen:
quelle
return fs.lstatSync(dpath).isDirectory()
, was würde sonst passieren, wenn isDirectory () false zurückgibt?fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Ich habe dieses Modul gerade veröffentlicht, weil ich diese Funktionalität brauchte.
https://www.npmjs.org/package/filendir
Es funktioniert wie ein Wrapper um Node.js fs-Methoden. Sie können es also genauso verwenden wie mit
fs.writeFile
undfs.writeFileSync
(sowohl asynchrone als auch synchrone Schreibvorgänge).quelle