अगर पैरेंट फोल्डर मौजूद नहीं है तो फाइल कैसे लिखें?


93

मुझे निम्नलिखित पथ पर फ़ाइल लिखने की आवश्यकता है:

fs.writeFile('/folder1/folder2/file.txt', 'content', function () {…});

लेकिन '/folder1/folder2'पथ मौजूद नहीं हो सकता है। तो मुझे निम्नलिखित त्रुटि मिलती है:

message = ENOENT, /folder1/folder2/file.txt को खोलें

मैं उस पथ पर सामग्री कैसे लिख सकता हूं?


2
fs.promises.mkdir(path.dirname('/folder1/folder2/file.txt'), {recursive: true}).then(x => fs.promises.writeFile('/folder1/folder2/file.txt', 'content'))
ऑफेंसो

जवाबों:


127

पहले के साथ संयोजन में mkdirp का उपयोग करें path.dirname

var mkdirp = require('mkdirp');
var fs = require('fs');
var getDirName = require('path').dirname;

function writeFile(path, contents, cb) {
  mkdirp(getDirName(path), function (err) {
    if (err) return cb(err);

    fs.writeFile(path, contents, cb);
  });
}

अगर पहले से ही पूरा रास्ता मौजूद है, तो mkdirpयह एक नॉओप है। अन्यथा यह आपके लिए सभी गायब निर्देशिका बनाता है।

यह मॉड्यूल वही करता है जो आप चाहते हैं: https://npmjs.org/package/writefile । "राइटफाइल mkdirp" के लिए googling होने पर इसे प्राप्त करें। यह मॉड्यूल कॉलबैक लेने के बजाय एक वादा लौटाता है, इसलिए पहले वादों के लिए कुछ परिचय पढ़ना सुनिश्चित करें। यह वास्तव में आपके लिए चीजों को जटिल कर सकता है।

मैंने जो फंक्शन दिया, वह किसी भी मामले में काम करता है।


तो अगर हम इसे पूरा करने के लिए इंतजार करना चाहते हैं तो हमें कॉलबैक में सब कुछ डाल देना होगा? क्या कोई और रास्ता है?
पीट

@ अगर आप बबल का उपयोग करते हैं, तो आप async के साथ जा सकते हैं / इस gist की तरह प्रतीक्षा कर सकते हैं: gist.github.com/lucasreppewelander/…
लुकास रेपे वेलैंडर

11
पुनरावर्ती का प्रयोग करें:fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Offenso

27

मुझे लगता है कि ऐसा करने का सबसे आसान तरीका एफएस-अतिरिक्त मॉड्यूल से आउटपुटफाइल () विधि का उपयोग करना है ।

लगभग वैसा ही जैसा राइटफाइल (यानी यह ओवरराइट हो जाता है), सिवाय इसके कि यदि मूल निर्देशिका मौजूद नहीं है, तो इसे बनाया जाता है। विकल्प हैं कि आप fs.writeFile () को क्या पास करेंगे।

उदाहरण:

var fs = require('fs-extra');
var file = '/tmp/this/path/does/not/exist/file.txt'

fs.outputFile(file, 'hello!', function (err) {
    console.log(err); // => null

    fs.readFile(file, 'utf8', function (err, data) {
        console.log(data); // => hello!
    });
});

यह भी इन दिनों बॉक्स से बाहर वादा समर्थन है !.


19

शायद सबसे सरल रूप से, आप बस fs-path npm मॉड्यूल का उपयोग कर सकते हैं ।

आपका कोड तब दिखेगा:

var fsPath = require('fs-path');

fsPath.writeFile('/folder1/folder2/file.txt', 'content', function(err){
  if(err) {
    throw err;
  } else {
    console.log('wrote a file like DaVinci drew machines');
  }
});

18

संपादित करें

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और EACCESWindows के लिए।
  • यह समाधान सापेक्ष और निरपेक्ष दोनों रास्तों को संभालता है।
  • सापेक्ष रास्तों के मामले में, वर्तमान कार्यशील निर्देशिका में लक्ष्य निर्देशिकाएं बनाई जाएंगी (हल की जाएंगी)। वर्तमान स्क्रिप्ट के सापेक्ष उन्हें हल करने के लिए, पास करें {isRelativeToScript: true}
  • क्रॉस-प्लेटफ़ॉर्म मुद्दों से बचने के लिए , का उपयोग करना path.sepऔर path.resolve(), न केवल /संघटन।
  • दौड़ की स्थितियों को संभालने के लिए फेंके जाने पर fs.mkdirSyncत्रुटि का उपयोग करना और try/catchउसे संभालना: एक अन्य प्रक्रिया कॉल के बीच फ़ाइल को जोड़ सकती है fs.existsSync()और fs.mkdirSync()अपवाद का कारण बन सकती है।
    • इसे प्राप्त करने का दूसरा तरीका यह है कि यदि कोई फ़ाइल मौजूद है तो उसे चेक करना, यानी, बनाना if (!fs.existsSync(curDir) fs.mkdirSync(curDir);। लेकिन यह एक विरोधी पैटर्न है जो कोड को दौड़ की स्थिति के लिए असुरक्षित बनाता है।
  • विनाशकारी का समर्थन करने के लिए नोड v6 और नए की आवश्यकता है । (यदि आपको पुराने नोड संस्करणों के साथ इस समाधान को लागू करने में समस्याएं हैं, तो बस मुझे एक टिप्पणी छोड़ दें)

3

आप उपयोग कर सकते हैं

fs.stat('/folder1/folder2', function(err, stats){ ... });

statsएक fs.Statsप्रकार की वस्तु है, आप जांच सकते हैं stats.isDirectory()। की परीक्षा पर निर्भर करता है errऔर statsआप कुछ कर सकते हैं, fs.mkdir( ... )या एक त्रुटि फेंक सकते हैं ।

संदर्भ

अद्यतन: कोड में अल्पविराम फिक्स्ड।


इसलिए मैं नोडज में सिबल कमांड का उपयोग करके फाइल नहीं लिख सकता हूं?
एरिक

2

यहाँ निर्देशिकाओं को पुन: बनाने के लिए मेरा कस्टम फ़ंक्शन है (कोई बाहरी निर्भरता नहीं):

var fs = require('fs');
var path = require('path');

var myMkdirSync = function(dir){
    if (fs.existsSync(dir)){
        return
    }

    try{
        fs.mkdirSync(dir)
    }catch(err){
        if(err.code == 'ENOENT'){
            myMkdirSync(path.dirname(dir)) //create parent dir
            myMkdirSync(dir) //create dir
        }
    }
}

myMkdirSync(path.dirname(filePath));
var file = fs.createWriteStream(filePath);

2

यहाँ मेरा फंक्शन है जो Node 10.12.0 में काम करता है। उम्मीद है कि यह मदद करेगा।

const fs = require('fs');
function(dir,filename,content){
        fs.promises.mkdir(dir, { recursive: true }).catch(error => { console.error('caught exception : ', error.message); });
        fs.writeFile(dir+filename, content, function (err) {
            if (err) throw err;
            console.info('file saved!');
        });
    }

2

नोड-एफएस-अतिरिक्त के साथ आप इसे आसानी से कर सकते हैं।

इसे स्थापित करो

npm install --save fs-extra

तब का उपयोग outputfile के बजाय विधि writeFileSync

const fs = require('fs-extra');

fs.outputFile('tmp/test.txt', 'Hey there!', err => {
  if(err) {
    console.log(err);
  } else {
    console.log('The file was saved!');
  }
})

0

यहाँ Myrne Stol के उत्तर का एक अलग भाग के रूप में उत्तर दिया गया है:

यह मॉड्यूल वही करता है जो आप चाहते हैं: https://npmjs.org/package/writefile । जब "राइटफाइल mkdirp" के लिए googling किया गया। यह मॉड्यूल कॉलबैक लेने के बजाय एक वादा लौटाता है, इसलिए पहले वादों के लिए कुछ परिचय पढ़ना सुनिश्चित करें। यह वास्तव में आपके लिए चीजों को जटिल कर सकता है।


0
let name = "./new_folder/" + file_name + ".png";
await driver.takeScreenshot().then(
  function(image, err) {
    require('mkdirp')(require('path').dirname(name), (err) => {
      require('fs').writeFile(name, image, 'base64', function(err) {
        console.log(err);
      });
    });
  }
);

कोड-ओनली उत्तरों को निम्न गुणवत्ता माना जाता है: यह सुनिश्चित करना सुनिश्चित करें कि आपका कोड क्या करता है और यह समस्या को हल कैसे करता है। यह पूछने वाले और भविष्य के पाठकों दोनों की मदद करेगा यदि आप अपनी पोस्ट में अधिक जानकारी जोड़ सकते हैं। पूरी तरह से कोड-आधारित उत्तरों की व्याख्या करना
Calos
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.