নোডের fs.mkdirSync দিয়ে কীভাবে পূর্ণ পথ তৈরি করবেন?


159

আমি যদি একটি অস্তিত্ব না থাকে তবে একটি সম্পূর্ণ পথ তৈরি করার চেষ্টা করছি।

কোডটি এর মতো দেখাচ্ছে:

var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest); 

এই কোডটি ততক্ষণ দুর্দান্ত কাজ করবে যতক্ষণ না কেবলমাত্র একটি উপ-ডিরেক্টরি ('dir1' এর মতো একটি নতুন ডিরেক্টরি) তবে যখন কোনও ডিরেক্টরি পথ যেমন ('dir1 / dir2') থাকে তখন এটি ত্রুটির সাথে ব্যর্থ হয় : ENOENT, এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই

আমি প্রয়োজন হিসাবে কোডের কয়েকটি লাইন দিয়ে পুরো পথ তৈরি করতে সক্ষম হতে চাই।

আমি পড়লাম fs এ একটি পুনরাবৃত্তির বিকল্প রয়েছে এবং এটি এটি চেষ্টা করে

var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest,'0777', true);

আমার মনে হচ্ছে পুনরাবৃত্তভাবে এমন একটি ডিরেক্টরি তৈরি করা উচিত যা অস্তিত্বহীন। আমি কি কিছু মিস করছি বা আমার কি পথটি বিশ্লেষণ এবং প্রতিটি ডিরেক্টরি পরীক্ষা করার এবং এটি ইতিমধ্যে বিদ্যমান না থাকলে এটি তৈরি করার দরকার আছে?

আমি নোডে বেশ নতুন। হয়তো আমি এফএস এর একটি পুরানো সংস্করণ ব্যবহার করছি?


1
github.com/substack/node-mkdirp এবং এই গুগল অনুসন্ধানে সমস্ত ধরণের অন্যান্য সমাধান ।
jفر00

4
@ অ্যান্ড্যরে এই স্ট্যাক ওভারফ্লো প্রশ্নটি এখন এই প্রশ্নের জন্য গুগলে শীর্ষ ফল, যা মজার কারণ এর অর্থ এটি পুনরাবৃত্তি ....
ম্যাট পার্কিনস

1
নোডের পুরানো সংস্করণগুলিতে এটি ছিল সমস্যা, নোড 12+ এ আপডেট করা সমস্যার সমাধান করে
মিঃজম্প

উত্তর:


48

একটি বিকল্প হ'ল শেলজ মডিউল ব্যবহার করা

এনপিএম শেলজ ইনস্টল করুন

var shell = require('shelljs');
shell.mkdir('-p', fullPath);

এই পৃষ্ঠা থেকে:

উপলব্ধ বিকল্প:

পি: সম্পূর্ণ পাথ (প্রয়োজন হলে মধ্যবর্তী ডায়ার তৈরি করবে)

অন্যরা যেমন উল্লেখ করেছে, আরও আরও ফোকাসযুক্ত মডিউল রয়েছে। তবে, এমকেডিআরপের বাইরে এটির প্রচুর অন্যান্য দরকারী শেল অপারেশন রয়েছে (যেমন, গ্রেপ ইত্যাদি ...) এবং এটি উইন্ডোজ এবং * নিক্সে কাজ করে


2
ধন্যবাদ! আমি এক্সিকে ব্যবহার করে শেষ করেছি (আমি ইতিমধ্যে এটি ব্যবহার করছিলাম) এবং এটি একটি কবজির মতো কাজ করে। var exec = প্রয়োজনীয় ('চাইল্ড_প্রসেস')। এক্সিকিউট; var কমান্ড = "mkdir -p '" + newDest + "'"; var অপশন = {}; var after = ফাংশন (ত্রুটি, stdout, stderr) so কনসোল.লগ ('ত্রুটি', ত্রুটি); কনসোল.লগ ('stdout', stdout); কনসোল.লগ ('স্ট্যাডার', স্ট্ডার); } exec (কমান্ড, বিকল্পগুলি, পরে);
ডেভিড সিলভা স্মিথ

24
এই বিকল্পটি নোড.জেএস প্ল্যাটফর্মগুলিতে ভেঙে যেতে পারে যার কোনও কমান্ড লাইন এমকেডির উদাহরণ নেই (যেমন, নন-লিনাক্স-ই হোস্ট) তাই এটি পোর্টেবল নয়, যদি তা বিবেচনা করে।
চশটান

1
@ চসটন - আপনি মন্তব্য বা উত্তর উল্লেখ করছেন? শেলজগুলি উইন্ডোতেও কাজ করে। exec mkdir -p (মন্তব্য) অবশ্যই করেন না।
ব্রায়ানম্যাক

আপনি এই দুর্দান্ত ফাংশনটি আপনার পছন্দের প্রতিশ্রুতি বা কলব্যাক দিয়ে ব্যবহার করতে পারেন ।
Зеленько

1
এটি কোনও সমাধান নয়, এটি সমাধানের বিকল্প। প্রসঙ্গ: pics.onsizzle.com/…
নিকা কসরাদজে

412

সম্পাদন করা

নোডজেএস সংস্করণ 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 এর জন্য। @ পেডিটি।, @ জনকিউ, @ ডিড02392, @ রবিওডার এবং @ অ্যালম্যাননের সমস্ত প্রতিবেদনের মন্তব্যে ধন্যবাদ।
  • এই সমাধানটি আপেক্ষিক এবং পরম পথ উভয়ই পরিচালনা করে। @ জোহান মন্তব্য করার জন্য ধন্যবাদ।
  • আপেক্ষিক পাথের ক্ষেত্রে, বর্তমান কার্যনির্বাহী ডিরেক্টরিতে লক্ষ্য ডিরেক্টরিগুলি তৈরি করা হবে (সমাধান করা)। এগুলি বর্তমান স্ক্রিপ্টের তুলনায় সমাধান করার জন্য, পাস করুন {isRelativeToScript: true}
  • ক্রস প্ল্যাটফর্মের সমস্যাগুলি এড়াতে কেবল কনটেক্সটেশন নয়, ব্যবহার path.sepএবং ।path.resolve()/
  • জাতির শর্তগুলি পরিচালনা করতে যদি ফেলে দেওয়া হয় তবে এর fs.mkdirSyncসাথে ত্রুটিটি ব্যবহার করা এবং পরিচালনা করা try/catch: অন্য একটি প্রক্রিয়া কলগুলির মধ্যে ফাইল যুক্ত করতে পারে fs.existsSync()এবং fs.mkdirSync()ব্যতিক্রম ঘটায়।
    • এটি অর্জনের অন্য উপায়টি যদি কোনও ফাইল উপস্থিত থাকে কিনা তা পরীক্ষা করে দেখাতে পারে, অর্থাত্‍, এটি if (!fs.existsSync(curDir) fs.mkdirSync(curDir);। তবে এটি একটি অ্যান্টি-প্যাটার্ন যা কোডটি রেস শর্তে দুর্বল করে leaves ডিরেক্টর অস্তিত্ব চেক সম্পর্কে @ জারশমমেস মন্তব্যকে ধন্যবাদ জানাই।
  • ডেস্ট্রাকচারিং সমর্থন করার জন্য নোড ভি 6 এবং আরও নতুন প্রয়োজন । (আপনার যদি পুরানো নোড সংস্করণ দিয়ে এই সমাধানটি কার্যকর করতে সমস্যা হয় তবে আমাকে কেবল একটি মন্তব্য দিন)

7
অতিরিক্ত লাইব্রেরি বা পদ্ধতির প্রয়োজন নেই এমন সহজ, পুনরাবৃত্ত প্রতিক্রিয়াটির জন্য এগিয়ে যান!
মাইকিং theViking

1
অনুপস্থিত বিবৃতি প্রয়োজন: কনস্ট fs = প্রয়োজনীয় ('fs'); কনস্ট পাথ = প্রয়োজনীয় ('পাথ');
ক্রিস্টোফার বুল

1
@ খ্রিস্টোফারবুল, ইচ্ছাকৃতভাবে যুক্তিতে মনোনিবেশ করার জন্য যুক্ত করা হয়নি, তবে যাইহোক, আমি সেগুলি যুক্ত করেছি। ধন্যবাদ;)
মৌনিয়ার

1
12 টি কঠিন কোডের লাইন, শূন্য নির্ভরতা, আমি এটি প্রতিবার নেব।
মুডবুম

1
@ ম্যাক ওএস এক্স 10.12.6 তে মউনিয়ার, পরম পথে যাওয়ার পরে "/" তৈরি করার চেষ্টা করার সময় যে ত্রুটি ছুঁড়েছে তা হ'ল "EISDIR" (ত্রুটি: EISDIR: ডিরেক্টরিতে অবৈধ ক্রিয়াকলাপ, mkdir '/')। আমি মনে করি সম্ভবত এখনও অস্তিত্বের জন্য যাচাই করা সবচেয়ে ভাল ক্রস-প্ল্যাটফর্মের উপায় (স্বীকৃতি দেওয়া এটি ধীর হবে)।
জন Q

78

আরও শক্তিশালী উত্তর হ'ল এমকেডিআরপি ব্যবহার করা ।

var mkdirp = require('mkdirp');

mkdirp('/path/to/dir', function (err) {
    if (err) console.error(err)
    else console.log('dir created')
});

তারপরে ফাইলটি পুরো পথে লিখতে এগিয়ে যান:

fs.writeFile ('/path/to/dir/file.dat'....

এই উত্তরটিকে পছন্দ করুন যেহেতু আপনি কেবল প্রয়োজনীয় লাইব্রেরি নয়, যা প্রয়োজন তা আমদানি করছেন
জুয়ান মেন্ডেস

1
পপুলিস্ট ব্যাজ ;-)
জানু

1
ধন্যবাদ। এটি এখন পর্যন্ত সবচেয়ে ভাল পদ্ধতি।
স্টেপান রাফায়েল 26'18


48

এফএস-অতিরিক্ত ফাইল সিস্টেম পদ্ধতি যুক্ত করে যা নেটিভ এফএস মডিউলে অন্তর্ভুক্ত থাকে না। এটি fs এর প্রতিস্থাপনের ড্রপ।

ইনস্টল করুন fs-extra

$ npm install --save fs-extra

const fs = require("fs-extra");
// Make sure the output directory is there.
fs.ensureDirSync(newDest);

সিঙ্ক এবং অ্যাসিঙ্ক বিকল্প রয়েছে।

https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureDir.md


5
এটাই সেরা উত্তর! আমাদের মধ্যে বেশিরভাগেরই যাহাই হউক না কেন অ্যাপটিতে fs- অতিরিক্ত রয়েছে extra
পেজপ

এটি memfsইউনিট পরীক্ষার জন্য ব্যবহারের সম্ভাবনা দিলে দুর্দান্ত হবে । এটি হয় না :-( github.com/jprichardson/node-fs-extra/issues/274
schnatterer

31

হ্রাস ব্যবহার করে আমরা প্রতিটি পথ বিদ্যমান কিনা তা যাচাই করতে পারি এবং প্রয়োজনে এটি তৈরি করতে পারি, এটিও আমার মনে হয় এটি অনুসরণ করা সহজ। সম্পাদিত, ধন্যবাদ @ আরভিন, যথাযথ প্ল্যাটফর্ম-নির্দিষ্ট পাথ বিভাগের বিভাজক পাওয়ার জন্য আমাদের পথ.স্যাপ ব্যবহার করা উচিত।

const path = require('path');

// Path separators could change depending on the platform
const pathToCreate = 'path/to/dir'; 
pathToCreate
 .split(path.sep)
 .reduce((prevPath, folder) => {
   const currentPath = path.join(prevPath, folder, path.sep);
   if (!fs.existsSync(currentPath)){
     fs.mkdirSync(currentPath);
   }
   return currentPath;
 }, '');

4
উত্তর দেওয়ার সময় আপনার উত্তরটি হ'ল কেন তা সম্পর্কে কিছুটা ব্যাখ্যা দেওয়া ভাল ।
স্টিফেন রাউচ

দুঃখিত, আপনি ঠিক বলেছেন, আমি মনে করি এইভাবে এটি আরও পরিষ্কার এবং অনুসরণ করা সহজ
josebui

4
@ জোসেবুই আমার মনে হয় পরিবেশের সমস্যাগুলি এড়াতে ফরোয়ার্ড স্ল্যাশ (/) এর পরিবর্তে "path.sep" ব্যবহার করা ভাল।
অরভিন

ভাল সমাধান কারণ নোডের প্রয়োজন নেই> = অন্যান্য উত্তরগুলির মতো
করিম

29

এই বৈশিষ্ট্যটি 10.12.0 সংস্করণে নোড.জেজে যুক্ত করা হয়েছে, সুতরাং এটি কলের {recursive: true}দ্বিতীয় যুক্তির মতো একটি বিকল্প পাস করার মতোই সহজ fs.mkdir()অফিসিয়াল ডক্সে উদাহরণটি দেখুন

বাহ্যিক মডিউল বা আপনার নিজের প্রয়োগের প্রয়োজন নেই।


1
আমি সম্পর্কিত পুল অনুরোধটি পেয়েছি github.com/nodejs/node/pull/23313
নিউরটিন

1
ডিরেক্টরি উপস্থিত থাকলে এবং বন্ধ হয়ে গেলে এটি ত্রুটি ফেলে দেবে। একটি ট্র্যাচ ক্যাচ ব্লক ব্যবহার করে এটি অন্য অস্তিত্বহীন ফোল্ডার তৈরি করতে পারে।
চোকো লি

1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। ডিরেক্টরিটি ইতিমধ্যে উপস্থিত থাকলে এটি ছোঁড়ে না এবং fs.promises.mkdir এর মাধ্যমে async / প্রতীক্ষার সাথে ব্যবহার করা যেতে পারে।
ধনী আপোডাকা

7

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে নোডেজগুলি v10.12.0 এখন বিকল্পে সত্যে recursiveসেট করে এটি স্থানীয়ভাবে সমর্থন করে । fs.mkdir

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


2

উইন্ডোজ জন্য উদাহরণ (অতিরিক্ত নির্ভরতা এবং ত্রুটি পরিচালনার জন্য নয়)

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

let dir = "C:\\temp\\dir1\\dir2\\dir3";

function createDirRecursively(dir) {
    if (!fs.existsSync(dir)) {        
        createDirRecursively(path.join(dir, ".."));
        fs.mkdirSync(dir);
    }
}

createDirRecursively(dir); //creates dir1\dir2\dir3 in C:\temp

2

আপনি পুনরাবৃত্তভাবে ফোল্ডারটির অস্তিত্ব রয়েছে কিনা তা যাচাই করতে পারেন এবং ফোল্ডারটি উপস্থিত না থাকলে যাচাই করে নিতে পারেন। ( কোনও বহিরাগত লাইব্রেরি )

function checkAndCreateDestinationPath (fileDestination) {
    const dirPath = fileDestination.split('/');
    dirPath.forEach((element, index) => {
        if(!fs.existsSync(dirPath.slice(0, index + 1).join('/'))){
            fs.mkdirSync(dirPath.slice(0, index + 1).join('/')); 
        }
    });
}

2

আপনি পরবর্তী ফাংশন ব্যবহার করতে পারেন

const recursiveUpload = (পাথ: স্ট্রিং) => {কনস্ট পাথ = পাথ.স্প্লিট ("/")

const fullPath = paths.reduce((accumulator, current) => {
  fs.mkdirSync(accumulator)
  return `${accumulator}/${current}`
  })

  fs.mkdirSync(fullPath)

  return fullPath
}

সুতরাং এটি কি করে:

  1. pathsপরিবর্তনশীল তৈরি করুন , যেখানে এটি অ্যারের উপাদান হিসাবে প্রতিটি পথ নিজেই সঞ্চয় করে।
  2. অ্যারেতে প্রতিটি উপাদান শেষে "/" যুক্ত করে।
  3. চক্রটি তৈরি করে:
    1. অ্যারে উপাদানগুলির সংমিশ্রণ থেকে সূচী 0 থেকে বর্তমান পুনরাবৃত্তির সূচকগুলি থেকে একটি ডিরেক্টরি তৈরি করে। মূলত, এটি পুনরাবৃত্ত হয়।

আশা করি এইটি কাজ করবে!

যাইহোক, নোড v10.12.0 এ আপনি অতিরিক্ত যুক্তি হিসাবে এটি পুনরুক্তি পথ তৈরি ব্যবহার করতে পারেন।

fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => { if (err) throw err; });

https://nodejs.org/api/fs.html#fs_fs_mkdirsync_path_options


1

অনেকগুলি উত্তর, তবে এখানে পুনরাবৃত্তি ছাড়াই একটি সমাধান যা পথটি বিভক্ত করে কাজ করে এবং তারপরে বাম থেকে ডানে এটিকে আবার ব্যাক আপ করে works

function mkdirRecursiveSync(path) {
    let paths = path.split(path.delimiter);
    let fullPath = '';
    paths.forEach((path) => {

        if (fullPath === '') {
            fullPath = path;
        } else {
            fullPath = fullPath + '/' + path;
        }

        if (!fs.existsSync(fullPath)) {
            fs.mkdirSync(fullPath);
        }
    });
};

উইন্ডোজ বনাম লিনাক্স সামঞ্জস্যতা সম্পর্কে উদ্বিগ্নদের জন্য, উপরের উভয় ঘটনায় কেবল ডাবল ব্যাকস্ল্যাশ '\' দিয়ে ফরোয়ার্ড স্ল্যাশ প্রতিস্থাপন করুন তবে টিবিএইচ আমরা নোড fs এর কথা বলছি উইন্ডোজ কমান্ড লাইন নয় এবং পূর্ববর্তীটি বেশ ক্ষমাশীল এবং উপরের কোডটি কেবলমাত্র কাজ করবে উইন্ডোজ এবং আরও একটি সম্পূর্ণ সমাধান ক্রস প্ল্যাটফর্ম।


উইন্ডোজ ফাইলগুলি ব্যাকস্ল্যাশ দ্বারা পরিচালিত হয় না ফরোয়ার্ড স্ল্যাশ। আপনার কোডটি কেবল সেখানে কাজ করবে না। সি: \ ডেটা \ পরীক্ষা ...
ডিডিডি

সম্পাদিত তবে আপনাকে নিজের মন্তব্যটি বৈধ করার পরামর্শ দিন। নোডে নিম্নলিখিতগুলি চেষ্টা করুন এবং দেখুন দেখুন কী হয় var fs = প্রয়োজনীয় ('fs') fs.mkdirSync ('test') fs.mkdirSync ('test \\ test1') fs.mkdirSync ('test / test2')
হামিওরা

আপনি যা কিছু বলছেন .., যতক্ষণ না আপনি আরও ভাল কোড লিখতে শিখেন ততক্ষণ আমার ডাউন ভোট এখনও থাকবে।
ডিডিডি

হা হা। ঠিক আছে, আমি আরও ভাল কোড কীভাবে লিখতে হয় তা শিখতে সত্যিই কঠোর পরিশ্রম করব। ওপি সহ উপরের বিটিডব্লিউ সর্বাধিক উত্তরগুলি ফরোয়ার্ড স্ল্যাশ ব্যবহার করে। আপনাকে ট্রোলিং বন্ধ করার পরামর্শ দিন।
হামিওরা

1
path.sepআমার / / \\ হিসাবে হয়ে আসছে। path.delimiterহয়: বা;।
জোশ অ্যান্ডারসন স্লেট

1
const fs = require('fs');

try {
    fs.mkdirSync(path, { recursive: true });
} catch (error) {
    // this make script keep running, even when folder already exist
    console.log(error);
}

0

পুনরাবৃত্তভাবে ডিরেক্টরিগুলি তৈরি করার একটি অ্যাসিনক্রোনাস উপায়:

import fs from 'fs'

const mkdirRecursive = function(path, callback) {
  let controlledPaths = []
  let paths = path.split(
    '/' // Put each path in an array
  ).filter(
    p => p != '.' // Skip root path indicator (.)
  ).reduce((memo, item) => {
    // Previous item prepended to each item so we preserve realpaths
    const prevItem = memo.length > 0 ? memo.join('/').replace(/\.\//g, '')+'/' : ''
    controlledPaths.push('./'+prevItem+item)
    return [...memo, './'+prevItem+item]
  }, []).map(dir => {
    fs.mkdir(dir, err => {
      if (err && err.code != 'EEXIST') throw err
      // Delete created directory (or skipped) from controlledPath
      controlledPaths.splice(controlledPaths.indexOf(dir), 1)
      if (controlledPaths.length === 0) {
        return callback()
      }
    })
  })
}

// Usage
mkdirRecursive('./photos/recent', () => {
  console.log('Directories created succesfully!')
})

0

mkdirpনোডেজগুলির জন্য আমার আবশ্যকীয় সংস্করণটি এখানে ।

function mkdirSyncP(location) {
    let normalizedPath = path.normalize(location);
    let parsedPathObj = path.parse(normalizedPath);
    let curDir = parsedPathObj.root;
    let folders = parsedPathObj.dir.split(path.sep);
    folders.push(parsedPathObj.base);
    for(let part of folders) {
        curDir = path.join(curDir, part);
        if (!fs.existsSync(curDir)) {
            fs.mkdirSync(curDir);
        }
    }
}

0

এই পদ্ধতির সম্পর্কে কীভাবে:

if (!fs.existsSync(pathToFile)) {
            var dirName = "";
            var filePathSplit = pathToFile.split('/');
            for (var index = 0; index < filePathSplit.length; index++) {
                dirName += filePathSplit[index]+'/';
                if (!fs.existsSync(dirName))
                    fs.mkdirSync(dirName);
            }
        }

এটি আপেক্ষিক পথে কাজ করে।


0

মৌনির শূন্য-নির্ভরতার উত্তরের ভিত্তিতে , এখানে Typescriptএকটি মডিউল হিসাবে আরও কিছুটা প্রাথমিক বন্ধুত্বপূর্ণ বৈকল্পিক:

import * as fs from 'fs';
import * as path from 'path';

/**
* Recursively creates directories until `targetDir` is valid.
* @param targetDir target directory path to be created recursively.
* @param isRelative is the provided `targetDir` a relative path?
*/
export function mkdirRecursiveSync(targetDir: string, isRelative = false) {
    const sep = path.sep;
    const initDir = path.isAbsolute(targetDir) ? sep : '';
    const baseDir = isRelative ? __dirname : '.';

    targetDir.split(sep).reduce((prevDirPath, dirToCreate) => {
        const curDirPathToCreate = path.resolve(baseDir, prevDirPath, dirToCreate);
        try {
            fs.mkdirSync(curDirPathToCreate);
        } catch (err) {
            if (err.code !== 'EEXIST') {
                throw err;
            }
            // caught EEXIST error if curDirPathToCreate already existed (not a problem for us).
        }

        return curDirPathToCreate; // becomes prevDirPath on next call to reduce
    }, initDir);
}

0

এই হিসাবে পরিষ্কার :)

function makedir(fullpath) {
  let destination_split = fullpath.replace('/', '\\').split('\\')
  let path_builder = destination_split[0]
  $.each(destination_split, function (i, path_segment) {
    if (i < 1) return true
    path_builder += '\\' + path_segment
    if (!fs.existsSync(path_builder)) {
      fs.mkdirSync(path_builder)
    }
  })
}

0

Fs.mkdir এর পুনরাবৃত্তির বিকল্প নিয়ে আমার সমস্যা ছিল তাই আমি একটি ফাংশন তৈরি করেছি যা নিম্নলিখিতটি করে:

  1. চূড়ান্ত লক্ষ্য dir দিয়ে শুরু করে এবং মূল পিতা বা মাতা পর্যন্ত কাজ করে সমস্ত ডিরেক্টরিগুলির একটি তালিকা তৈরি করে।
  2. Mkdir ফাংশনটি কাজ করার জন্য প্রয়োজনীয় ডিরেক্টরিগুলির একটি নতুন তালিকা তৈরি করে
  3. ফাইনাল সহ প্রতিটি ডিরেক্টরি প্রয়োজনীয় করে তোলে

    function createDirectoryIfNotExistsRecursive(dirname) {
        return new Promise((resolve, reject) => {
           const fs = require('fs');
    
           var slash = '/';
    
           // backward slashes for windows
           if(require('os').platform() === 'win32') {
              slash = '\\';
           }
           // initialize directories with final directory
           var directories_backwards = [dirname];
           var minimize_dir = dirname;
           while (minimize_dir = minimize_dir.substring(0, minimize_dir.lastIndexOf(slash))) {
              directories_backwards.push(minimize_dir);
           }
    
           var directories_needed = [];
    
           //stop on first directory found
           for(const d in directories_backwards) {
              if(!(fs.existsSync(directories_backwards[d]))) {
                 directories_needed.push(directories_backwards[d]);
              } else {
                 break;
              }
           }
    
           //no directories missing
           if(!directories_needed.length) {
              return resolve();
           }
    
           // make all directories in ascending order
           var directories_forwards = directories_needed.reverse();
    
           for(const d in directories_forwards) {
              fs.mkdirSync(directories_forwards[d]);
           }
    
           return resolve();
        });
     }

-1

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

fs = require('fs');
makedirs = function(path, func) {
 var pth = path.replace(/['\\]+/g, '/');
 var els = pth.split('/');
 var all = "";
 (function insertOne() {
   var el = els.splice(0, 1)[0];
   if (!fs.existsSync(all + el)) {
    fs.mkdirSync(all + el);
   }
   all += el + "/";
   if (els.length == 0) {
    func();
   } else {
     insertOne();
   }
   })();

}


-1

এই সংস্করণটি উইন্ডোজে উপরের উত্তরের চেয়ে আরও ভাল কাজ করে কারণ এটি উভয়ই বোঝে /এবং path.sepযাতে ফরোয়ার্ড স্ল্যাশগুলি উইন্ডোজে যেমন করা উচিত তেমনই কাজ করে। পরম এবং আপেক্ষিক পাথ সমর্থন করে (এর সাথে সম্পর্কিত process.cwd)।

/**
 * Creates a folder and if necessary, parent folders also. Returns true
 * if any folders were created. Understands both '/' and path.sep as 
 * path separators. Doesn't try to create folders that already exist,
 * which could cause a permissions error. Gracefully handles the race 
 * condition if two processes are creating a folder. Throws on error.
 * @param targetDir Name of folder to create
 */
export function mkdirSyncRecursive(targetDir) {
  if (!fs.existsSync(targetDir)) {
    for (var i = targetDir.length-2; i >= 0; i--) {
      if (targetDir.charAt(i) == '/' || targetDir.charAt(i) == path.sep) {
        mkdirSyncRecursive(targetDir.slice(0, i));
        break;
      }
    }
    try {
      fs.mkdirSync(targetDir);
      return true;
    } catch (err) {
      if (err.code !== 'EEXIST') throw err;
    }
  }
  return false;
}

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