নোড.জেজে ফাইল করার জন্য ডিরেক্টরি তৈরি করুন


134

আমি নোড.জেএস এর সাথে ঝাঁকুনি দিয়েছি এবং কিছুটা সমস্যা পেয়েছি। আমি একটি স্ক্রিপ্ট পেয়েছি যা ডাকা ডিরেক্টরিতে থাকে data। আমি চাই স্ক্রিপ্টটি সাব-ডিরেক্টরিতে একটি উপ-ডিরেক্টরিতে কোনও ফাইলের জন্য কিছু ডেটা লিখতে data। তবে আমি নিম্নলিখিত ত্রুটি পাচ্ছি:

{ [Error: ENOENT, open 'D:\data\tmp\test.txt'] errno: 34, code: 'ENOENT', path: 'D:\\data\\tmp\\test.txt' }

কোডটি নিম্নরূপ:

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

কোনও ফাইল লেখার জন্য যদি নোড.জেএস ডিরেক্টরি কাঠামো তৈরি না করে তবে কীভাবে আমাকে তা তৈরি করতে সাহায্য করতে পারে কেউ?


1
fs.promises.mkdir(path.dirname("tmp/test.txt"), {recursive: true}).then(x => fs.promises.writeFile("tmp/test.txt", "Hey there!"))
অফেনসো

উত্তর:


127

নোড> 10.12.0

fs.mkdir এখন এর { recursive: true }মত একটি বিকল্প গ্রহণ করে :

// Creates /tmp/a/apple, regardless of whether `/tmp` and /tmp/a exist.
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
  if (err) throw err;
});

বা একটি প্রতিশ্রুতি সহ:

fs.promises.mkdir('/tmp/a/apple', { recursive: true }).catch(console.error);

নোড <= 10.11.0

আপনি এমকেডির্প বা এফএস-এক্সট্রা জাতীয় প্যাকেজ সহ এটি সমাধান করতে পারেন । আপনি যদি কোনও প্যাকেজ ইনস্টল করতে না চান তবে দয়া করে নীচে টিয়াগো পেরেস ফ্রান্সেসের উত্তর দেখুন।


4
আমি সেই সাথে যাচ্ছি ... এই পরিসংখ্যানগুলি আমাকে জিতিয়েছে।
অরণ মুলহোল্যান্ড

নোট যে fs.promisesএখনও পরীক্ষামূলক nodejs.org/dist/latest-v10.x/docs/api/…
lasec0203

132

আপনি যদি কোনও অতিরিক্ত প্যাকেজ ব্যবহার করতে না চান, আপনি নিজের ফাইলটি তৈরি করার আগে নিম্নলিখিত ফাংশনটিতে কল করতে পারেন:

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

function ensureDirectoryExistence(filePath) {
  var dirname = path.dirname(filePath);
  if (fs.existsSync(dirname)) {
    return true;
  }
  ensureDirectoryExistence(dirname);
  fs.mkdirSync(dirname);
}

2
এই ব্যবহার করা উচিত statSyncপরিবর্তে existsSync, উপর ভিত্তি করে stackoverflow.com/questions/4482686/...
GavinR

1
pathএটি এমন একটি প্যাকেজও যা প্রয়োজন ঠিক যেমন fs: var path = require('path')যে কেউ যদি অবাক হয়। নোড ডকুমেন্টেশন দেখুন ।
রাফায়েল এমশফ

9
fs.existsSyncঅবচয় করা হয় না , শুধুমাত্র fs.existsহয়।
zzzzBov

6
Fs.existsSync ফাংশনটি হ্রাস করা হয়েছে কিনা তা নিয়ে কিছু বিভ্রান্তি দেখা দিয়েছে। প্রথমে, আমার বোঝার দ্বারা, আমি ভেবেছিলাম এটি তাই আমি এটি প্রতিফলিত করার জন্য উত্তর আপডেট করেছি। তবে এখন, @zzzzBov দ্বারা চিহ্নিত হিসাবে, ডকুমেন্টেশনে পরিষ্কারভাবে বলা হয়েছে যে কেবল fs.exists অবমূল্যায়ন করা হয়েছে, fs.existsSync এর ব্যবহার এখনও বৈধ। এই কারণে আমি আগের কোডটি মুছে ফেলেছি এবং আমার উত্তরে এখন কেবলমাত্র সহজ সমাধান রয়েছে (fs.existsSync ব্যবহারের সাথে)।
টিয়াগো পেরেস ফ্রানিয়া

1
@ ক্রিসমার্কগুলি নিম্নলিখিত পথটি কল্পনা করুন: "/home/documents/a/b/c/myfile.txt"। "/ হোম / ডকুমেন্টস" উপস্থিত রয়েছে, যদিও এর সামনে সমস্ত কিছুই থাকে না। যখন প্রথমবারের জন্য "SureDirectoryExistance" বলা হয়, তখন ডেরনাম হয় "/ হোম / ডকুমেন্টস / এ / বি / সি"। আমি এখনই fs.mkdirSync (dirname) কল করতে পারি না কারণ "/ home / নথি / a / b" এরও অস্তিত্ব নেই। "গ" ডিরেক্টরিটি তৈরি করতে আমার প্রথমে "/ হোম / ডকুমেন্টস / এ / বি" এর অস্তিত্ব নিশ্চিত করতে হবে।
টিয়াগো পেরেস ফ্রান্সিয়া

43

সঙ্গে নোড-FS-অতিরিক্ত আপনি এটি সহজে এটা করতে পারেন।

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

npm install --save fs-extra

তারপরে outputFileপদ্ধতিটি ব্যবহার করুন । এর ডকুমেন্টেশন বলে:

প্রায় লেখার ফাইলের সমান (যেমন এটি ওভাররাইট করে), পিতামহিত ডিরেক্টরি উপস্থিত না থাকলে এটি তৈরি হয়।

আপনি এটি তিনটি উপায়ে ব্যবহার করতে পারেন:

কলব্যাক শৈলী

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

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

প্রতিশ্রুতি ব্যবহার

আপনি যদি প্রতিশ্রুতি ব্যবহার করেন এবং আমিও আশা করি, এটি কোড:

fse.outputFile('tmp/test.txt', 'Hey there!')
   .then(() => {
       console.log('The file was saved!');
   })
   .catch(err => {
       console.error(err)
   });

সিঙ্ক সংস্করণ

আপনি যদি একটি সিঙ্ক সংস্করণ চান তবে কেবল এই কোডটি ব্যবহার করুন:

fse.outputFileSync('tmp/test.txt', 'Hey there!')

সম্পূর্ণ রেফারেন্সের জন্য outputFileডকুমেন্টেশন এবং সমস্ত নোড-এফএস-অতিরিক্ত সমর্থিত পদ্ধতিগুলি পরীক্ষা করুন


26

নির্লজ্জ প্লাগ সতর্কতা!

আপনার যে পাথ কাঠামোটি চান তা প্রতিটি ডিরেক্টরিতে আপনাকে পরীক্ষা করতে হবে এবং এটি উপস্থিত না থাকলে ম্যানুয়ালি তৈরি করতে হবে। এটি করার সমস্ত সরঞ্জাম নোডের এফএস মডিউলে ইতিমধ্যে রয়েছে তবে আপনি কেবল সেগুলি করতে পারেন কেবল আমার এমকেপাথ মডিউল দিয়ে: https://github.com/jrajav/mkpath


1
এটি সরাসরি বা কেবল ডিরেক্টরি কাঠামো ফাইল তৈরি করবে? আমি এমন একটি সমাধান খুঁজছি যা ফাইলটি তৈরি করার সময় ডিরেক্টরি কাঠামোর পাশাপাশি ফাইল তৈরি করে।
হিরवेश

কেবল ডিরেক্টরি কাঠামো। আপনি প্রথমে mkdir / পাথ এবং যদি কোনও ত্রুটি না থাকে তবে আপনার ফাইলটি লেখার জন্য এগিয়ে যান। দু'জনে একসাথে করার জন্য একটি ফাংশন লিখতে যথেষ্ট সহজ হবে, কোনও ফাইলকে লেখার জন্য একটি সম্পূর্ণ পাথ দেওয়া হয়েছে - কেবল পথ.ব্যাসনাম
জরাজাব

1
আসলে, এটি এত সহজ ছিল যে আমি এটি 2 মিনিটের মধ্যে লিখেছিলাম । :) (স্বাক্ষরিত)
jrajav

আপডেট: পরীক্ষিত এবং সম্পাদিত, দয়া করে যদি এটি প্রথমবার কাজ না করে তবে আবার চেষ্টা করুন।
jrajav

8
@ কিউউরা কীভাবে এটি বহুল ব্যবহৃত এমকেডিরপ থেকে আলাদা ?
ডেভিড ওয়েলডন

9

যেহেতু আমি এখনও মন্তব্য করতে পারি না, তাই আমি @ টিয়াগো-পেরেস-ফ্রানিয়া চমত্কার সমাধানের উপর ভিত্তি করে একটি বর্ধিত উত্তর পোস্ট করছি (ধন্যবাদ!) তার কোডটি এমন কোনও ক্ষেত্রে ডিরেক্টরি তৈরি করে না যেখানে কেবল শেষ ডিরেক্টরিটি অনুপস্থিত, যেমন ইনপুটটি "সি: / টেস্ট / অ্যাবসি" এবং "সি: / পরীক্ষা" ইতিমধ্যে বিদ্যমান রয়েছে। এখানে একটি স্নিপেট যা কাজ করে:

function mkdirp(filepath) {
    var dirname = path.dirname(filepath);

    if (!fs.existsSync(dirname)) {
        mkdirp(dirname);
    }

    fs.mkdirSync(filepath);
}

1
এটি কারণ @ টিয়াগো এর সমাধান ফাইলের পথ প্রত্যাশা করে। আপনার ক্ষেত্রে, আপনার abcজন্য ডিরেক্টরি তৈরি করতে হবে এমন ফাইল হিসাবে ব্যাখ্যা করা হয়। abcডিরেক্টরিটি তৈরি করতে , আপনার পথে একটি ডামি ফাইল যুক্ত করুন, যেমন C:/test/abc/dummy.txt
স্পিনএক্সএক্সএক্স

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

1
@ ওফেনসো এটি সেরা সমাধান, তবে নোড.জেএস সংস্করণ 10.12 এবং কেবলমাত্র উপরে।
নিকসেনসুল

8

আমার পরামর্শটি হ'ল: যখন আপনি কয়েকটি কোডের লাইন দিয়ে খুব সহজেই এটি করতে পারেন তখন নির্ভরতার উপর নির্ভর করার চেষ্টা করবেন না

14 লাইন কোডে আপনি যা অর্জন করতে চাইছেন তা এখানে :

fs.isDir = function(dpath) {
    try {
        return fs.lstatSync(dpath).isDirectory();
    } catch(e) {
        return false;
    }
};
fs.mkdirp = function(dirname) {
    dirname = path.normalize(dirname).split(path.sep);
    dirname.forEach((sdir,index)=>{
        var pathInQuestion = dirname.slice(0,index+1).join(path.sep);
        if((!fs.isDir(pathInQuestion)) && pathInQuestion) fs.mkdirSync(pathInQuestion);
    });
};

1
তৃতীয় লাইন কি এর চেয়ে ভাল হবে না? return fs.lstatSync(dpath).isDirectory(), অন্যথায় যদি ডিরেক্টরী () মিথ্যা প্রত্যাবর্তন করে তবে কী হবে?
জর্জিও আরেসু

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

1
@ ওফেনসো এটি কোনও নোড 8 দ্বারা সমর্থিত নয়
আইভজেন নায়দা

2

আমি কেবল এই মডিউলটি প্রকাশ করেছি কারণ আমার এই কার্যকারিতাটির প্রয়োজন।

https://www.npmjs.org/package/filendir

এটি Node.js fs পদ্ধতিগুলির চারপাশে মোড়কের মতো কাজ করে। সুতরাং আপনি এটির সাথে ঠিক একইভাবে ব্যবহার করতে পারেন fs.writeFileএবং fs.writeFileSync(উভয়ই অ্যাসিঙ্ক এবং সিঙ্ক্রোনাস লিখিত)

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