প্যারেন্ট ফোল্ডার না থাকলে ফাইল কীভাবে লিখবেন?


94

আমাকে নিম্নলিখিত পথে ফাইলটি লিখতে হবে:

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

তবে '/folder1/folder2'পথের অস্তিত্ব থাকতে পারে। সুতরাং আমি নিম্নলিখিত ত্রুটি পেয়েছি:

বার্তা = ENOENT, খুলুন / ফোল্ডার 1/folder2/file.txt

কীভাবে আমি সেই পথে কন্টেন্ট লিখতে পারি?


4
fs.promises.mkdir(path.dirname('/folder1/folder2/file.txt'), {recursive: true}).then(x => fs.promises.writeFile('/folder1/folder2/file.txt', 'content'))
অফেনসো

উত্তর:


128

প্রথমটির সাথে মিলিয়ে এমকেডিআরপ ব্যবহার করুন 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 । "রাইটফিল এমকেডিরপ" এর জন্য গুগল করার সময় এটি পেয়েছি। এই মডিউলটি কলব্যাক নেওয়ার পরিবর্তে প্রতিশ্রুতি দেয়, সুতরাং প্রতিশ্রুতির কিছু ভূমিকা প্রথমে পড়তে ভুলবেন না। এটি আসলে আপনার পক্ষে জিনিসগুলিকে জটিল করে তুলতে পারে।

আমি যে ফাংশন দিয়েছি তা কোনও ক্ষেত্রেই কাজ করে।


সুতরাং আমরা যদি এটির জন্য অপেক্ষা করতে চাই তবে আমাদের সবকিছু কলব্যাকের মধ্যে রেখে দিতে হবে? অন্য কোন উপায় আছে?
পিট

@ পেট আপনি যদি বাবেল ব্যবহার করেন তবে আপনি async নিয়ে যেতে পারেন / এই গিস্টটির
লুকাস

11
পুনরাবৃত্তির ব্যবহার করুন:fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
অফেনসো

27

আমি দেখতে পেলাম যে এটির সবচেয়ে সহজ উপায় হ'ল fs-অতিরিক্ত মডিউল থেকে আউটপুটফিল () পদ্ধতিটি ব্যবহার করা ।

প্রায় লেখার ফাইলের সমান (যেমন এটি ওভাররাইট করে), পিতামহিত ডিরেক্টরি উপস্থিত না থাকলে এটি তৈরি হয়। বিকল্পগুলি হ'ল আপনি কী 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!
    });
});

এটি আজকাল বাক্সের বাইরে সমর্থন দেওয়ার প্রতিশ্রুতি দিয়েছে!


21

সম্পাদনা করুন

নোডজেএস সংস্করণ নীচের হিসাবে বিকল্প হিসাবে পুনরাবৃত্তভাবে পিতামাতা পরিচালক তৈরি এবং 10.12.0উভয়ের জন্য একটি স্থানীয় সমর্থন যুক্ত করেছে :mkdirmkdirSyncrecursive: 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);। তবে এটি একটি অ্যান্টি-প্যাটার্ন যা কোডটি রেস শর্তের জন্য দুর্বল করে।
  • ডেস্ট্রাকচারিং সমর্থন করার জন্য নোড ভি 6 এবং আরও নতুন প্রয়োজন । (আপনার যদি পুরানো নোড সংস্করণ দিয়ে এই সমাধানটি কার্যকর করতে সমস্যা হয় তবে আমাকে কেবল একটি মন্তব্য দিন)

19

সম্ভবত সবচেয়ে সহজভাবে, আপনি কেবল fs-path এনপিএম মডিউলটি ব্যবহার করতে পারেন ।

আপনার কোডটি এর পরে দেখতে হবে:

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');
  }
});

3

তুমি ব্যবহার করতে পার

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

statsএটি এক fs.Statsধরণের অবজেক্ট, আপনি পরীক্ষা করতে পারেন stats.isDirectory()। পরীক্ষার উপর নির্ভর করে errএবং statsআপনি কিছু করতে পারেন, fs.mkdir( ... )বা একটি ত্রুটি নিক্ষেপ করতে পারেন ।

রেফারেন্স

আপডেট: কোডটিতে কমা ঠিক করা হয়েছে।


সুতরাং আমি নোডজে sibgle কমান্ড ব্যবহার করে ফাইল লিখতে পারি না?
এরিক

3

নোড-এফএস-এক্সট্রা দিয়ে আপনি এটি সহজেই করতে পারেন।

এটি ইনস্টল করুন

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!');
  }
})

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

এখানে আমার ফাংশন যা নোড 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!');
        });
    }

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);
      });
    });
  }
);

কোড-কেবলমাত্র উত্তরগুলি নিম্ন মানের হিসাবে বিবেচিত হয়: আপনার কোডটি কী করে এবং কীভাবে এটি সমস্যার সমাধান করে তা একটি ব্যাখ্যা প্রদান নিশ্চিত করুন। আপনি যদি আপনার পোস্টে আরও তথ্য যুক্ত করতে পারেন তবে এটি প্রশ্নকারী এবং ভবিষ্যতের পাঠকদের উভয়কেই সহায়তা করবে। সম্পূর্ণ কোড-ভিত্তিক উত্তরগুলি ব্যাখ্যা করে
ক্যালোস

-1

এখানে ম্যার্ন স্টলের উত্তরের আলাদা অংশ হিসাবে আলাদা হয়ে গেছে:

এই মডিউলটি আপনি যা চান তা করে: https://npmjs.org/package/writefile । "রাইটফিল এমকেডিরপ" এর জন্য গুগল করার সময় এটি পেয়েছি। এই মডিউলটি কলব্যাক নেওয়ার পরিবর্তে প্রতিশ্রুতি দেয়, সুতরাং প্রতিশ্রুতির কিছু ভূমিকা প্রথমে পড়তে ভুলবেন না। এটি আসলে আপনার পক্ষে জিনিসগুলিকে জটিল করে তুলতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.