संपादित करें
NodeJS संस्करण 10.12.0
ने दोनों के लिए एक मूल समर्थन जोड़ा है mkdir
और निम्नलिखित के रूप में विकल्प के mkdirSync
साथ मूल निर्देशक बनाने के लिए recursive: true
:
fs.mkdirSync(targetDir, { recursive: true });
और यदि आप चाहें fs Promises API
, तो आप लिख सकते हैं
fs.promises.mkdir(targetDir, { recursive: true });
मूल उत्तर
यदि वे मौजूद नहीं हैं, तो माता-पिता निर्देशिका को पुन: बनाएँ! ( शून्य निर्भरता )
const fs = require('fs');
const path = require('path');
function mkDirByPathSync(targetDir, { isRelativeToScript = false } = {}) {
const sep = path.sep;
const initDir = path.isAbsolute(targetDir) ? sep : '';
const baseDir = isRelativeToScript ? __dirname : '.';
return targetDir.split(sep).reduce((parentDir, childDir) => {
const curDir = path.resolve(baseDir, parentDir, childDir);
try {
fs.mkdirSync(curDir);
} catch (err) {
if (err.code === 'EEXIST') { // curDir already exists!
return curDir;
}
// To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows.
if (err.code === 'ENOENT') { // Throw the original parentDir error on curDir `ENOENT` failure.
throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`);
}
const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1;
if (!caughtErr || caughtErr && curDir === path.resolve(targetDir)) {
throw err; // Throw if it's just the last created dir.
}
}
return curDir;
}, initDir);
}
प्रयोग
// Default, make directories relative to current working directory.
mkDirByPathSync('path/to/dir');
// Make directories relative to the current script.
mkDirByPathSync('path/to/dir', {isRelativeToScript: true});
// Make directories with an absolute path.
mkDirByPathSync('/path/to/dir');
डेमो
कोशिश करो!
स्पष्टीकरण
- [अद्यतन] की तरह यह समाधान हैंडल मंच-विशिष्ट त्रुटियाँ
EISDIR
मैक और के लिए EPERM
और EACCES
Windows के लिए।
- यह समाधान सापेक्ष और निरपेक्ष दोनों रास्तों को संभालता है।
- सापेक्ष रास्तों के मामले में, वर्तमान कार्यशील निर्देशिका में लक्ष्य निर्देशिकाएं बनाई जाएंगी (हल की जाएंगी)। वर्तमान स्क्रिप्ट के सापेक्ष उन्हें हल करने के लिए, पास करें
{isRelativeToScript: true}
।
- क्रॉस-प्लेटफ़ॉर्म मुद्दों से बचने के लिए , का उपयोग करना
path.sep
और path.resolve()
, न केवल /
संघटन।
- दौड़ की स्थितियों को संभालने के लिए फेंके जाने पर
fs.mkdirSync
त्रुटि का उपयोग करना और try/catch
उसे संभालना: एक अन्य प्रक्रिया कॉल के बीच फ़ाइल को जोड़ सकती है fs.existsSync()
और fs.mkdirSync()
अपवाद का कारण बन सकती है।
- इसे प्राप्त करने का दूसरा तरीका यह है कि यदि कोई फ़ाइल मौजूद है तो उसे चेक करना, यानी, बनाना
if (!fs.existsSync(curDir) fs.mkdirSync(curDir);
। लेकिन यह एक विरोधी पैटर्न है जो कोड को दौड़ की स्थिति के लिए असुरक्षित बनाता है।
- विनाशकारी का समर्थन करने के लिए नोड v6 और नए की आवश्यकता है । (यदि आपको पुराने नोड संस्करणों के साथ इस समाधान को लागू करने में समस्याएं हैं, तो बस मुझे एक टिप्पणी छोड़ दें)
fs.promises.mkdir(path.dirname('/folder1/folder2/file.txt'), {recursive: true}).then(x => fs.promises.writeFile('/folder1/folder2/file.txt', 'content'))