Saya telah bermain-main dengan Node.js dan menemukan sedikit masalah. Saya punya skrip yang berada di direktori bernama data
. Saya ingin skrip untuk menulis beberapa data ke file dalam subdirektori dalam data
subdirektori. Namun saya mendapatkan kesalahan berikut:
{ [Error: ENOENT, open 'D:\data\tmp\test.txt'] errno: 34, code: 'ENOENT', path: 'D:\\data\\tmp\\test.txt' }
Kode tersebut adalah sebagai berikut:
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!");
}
});
Adakah yang bisa membantu saya mencari tahu bagaimana membuat Node.js membuat struktur direktori jika tidak keluar untuk menulis ke file?
javascript
node.js
Hirvesh
sumber
sumber
fs.promises.mkdir(path.dirname("tmp/test.txt"), {recursive: true}).then(x => fs.promises.writeFile("tmp/test.txt", "Hey there!"))
Jawaban:
Node> 10.12.0
fs.mkdir sekarang menerima
{ recursive: true }
opsi seperti:atau dengan janji:
Node <= 10.11.0
Anda dapat menyelesaikan ini dengan paket seperti mkdirp atau fs-extra . Jika Anda tidak ingin menginstal paket, silakan lihat jawaban Tiago Peres França di bawah ini.
sumber
fs.promises
masih eksperimental nodejs.org/dist/latest-v10.x/docs/api/…Jika Anda tidak ingin menggunakan paket tambahan apa pun, Anda dapat memanggil fungsi berikut sebelum membuat file Anda:
sumber
statSync
sebagai gantinyaexistsSync
, berdasarkan stackoverflow.com/questions/4482686/…path
juga merupakan paket yang perlu diminta sepertifs
:var path = require('path')
jika ada orang yang bertanya-tanya. Lihat dokumentasi simpul .fs.existsSync
adalah tidak usang , hanyafs.exists
adalah.Dengan node-fs-extra Anda dapat melakukannya dengan mudah.
Pasang itu
Kemudian gunakan
outputFile
metode ini. Dokumentasinya mengatakan:Anda dapat menggunakannya dalam tiga cara:
Gaya panggilan balik
Menggunakan Janji
Jika Anda menggunakan janji , dan saya harap begitu, ini kodenya:
Versi sinkronisasi
Jika Anda ingin versi sinkronisasi, cukup gunakan kode ini:
Untuk referensi lengkap, periksa
outputFile
dokumentasi dan semua metode yang didukung node-fs-extra .sumber
Peringatan plug tak tahu malu!
Anda harus memeriksa setiap direktori dalam struktur jalur yang Anda inginkan dan membuatnya secara manual jika tidak ada. Semua alat untuk melakukannya sudah ada di modul fode Node, tetapi Anda dapat melakukan semua itu hanya dengan modul mkpath saya: https://github.com/jrajav/mkpath
sumber
Karena saya belum bisa berkomentar, saya memposting jawaban yang ditingkatkan berdasarkan solusi fantastis @ tiago-peres-frança (terima kasih!). Kode-nya tidak membuat direktori dalam kasus di mana hanya direktori terakhir yang hilang di jalur, misalnya inputnya adalah "C: / test / abc" dan "C: / test" sudah ada. Berikut ini cuplikan yang berfungsi:
sumber
abc
ditafsirkan sebagai file yang Anda butuhkan untuk membuat direktori. Untuk juga membuatabc
direktori, tambahkan file dummy ke jalur Anda, misC:/test/abc/dummy.txt
.fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Saran saya adalah: cobalah untuk tidak bergantung pada dependensi ketika Anda dapat dengan mudah melakukannya dengan beberapa baris kode
Inilah yang ingin Anda capai dalam 14 baris kode:
sumber
return fs.lstatSync(dpath).isDirectory()
, jika tidak, apa yang akan terjadi jika isDirectory () mengembalikan false?fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Saya baru saja menerbitkan modul ini karena saya membutuhkan fungsi ini.
https://www.npmjs.org/package/filendir
Ini bekerja seperti pembungkus di sekitar metode Node.js fs. Jadi Anda dapat menggunakannya dengan cara yang persis sama dengan
fs.writeFile
danfs.writeFileSync
(baik async dan sinkron menulis)sumber