নোড.জেগুলি ফোল্ডার তৈরি করে বা বিদ্যমান ব্যবহার করে


186

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

বর্তমানে, আমার কাছে এই কোডটি রয়েছে, যা ফোল্ডার তৈরি করতে বা পরিবর্তে একটি বিদ্যমান ব্যবহার করার চেষ্টা করে:

fs.mkdir(path,function(e){
    if(!e || (e && e.code === 'EEXIST')){
        //do something with contents
    } else {
        //debug
        console.log(e);
    }
});

তবে আমি ভাবছি এটি করার সঠিক উপায় এটি কি? কোডটি পরীক্ষা EEXISTকরে ফোল্ডারটি ইতিমধ্যে উপস্থিত রয়েছে তা জানতে সঠিক উপায়? আমি জানি fs.stat()ডিরেক্টরি তৈরি করার আগে আমি করতে পারি , তবে এটি ইতিমধ্যে ফাইল সিস্টেমে দুটি হিট হবে।

দ্বিতীয়ত, নোড.জেএস এর একটি সম্পূর্ণ বা কমপক্ষে আরও বিস্তৃত ডকুমেন্টেশন রয়েছে যাতে ত্রুটিযুক্ত বস্তুগুলি কী রয়েছে, কোন প্যারামিটারগুলি নির্দেশ করে ইত্যাদি বিশদ রয়েছে contains


31
ছোট নিটপিক, তবে এ থেকে মুক্তি পান e &&। যদি !eব্যর্থ হয়, তবে আপনি জানেন eসত্যবাদী।
আমি অলস ঘৃণা

উত্তর:


236

এটি করার ভাল উপায় হ'ল এমকেডিআরপি মডিউল ব্যবহার করা ।

$ npm install mkdirp

ডিরেক্টরিটি প্রয়োজন এমন ফাংশনটি চালাতে এটি ব্যবহার করুন। পাথ তৈরি হওয়ার পরে বা পথটি ইতিমধ্যে উপস্থিত থাকলে কলব্যাক বলা হয়। errMkdirp ডিরেক্টরি পাথ তৈরি করতে ব্যর্থ হলে ত্রুটি সেট করা হয়।

var mkdirp = require('mkdirp');
mkdirp('/tmp/some/path/foo', function(err) { 

    // path exists unless there was an error

});

3
আমার কাছে মনে হচ্ছে সঠিকভাবে ('না-নির্ভরতা-যুক্ত' পড়ুন) উত্তরটি ব্যবহার করে @ রাউগারাল দ্বারা এক নিচু হবে fs.exists(Sync)
রিকার্ডো পেদ্রোনি

@ মাওওপিপিএল, এটি 'মেকেরেক্টরিওরিপি'। 'পি' অজানা।
অ্যান্ড্রু

4
@ রিকার্ডোপেড্রোনি সঠিক পদ্ধতিটি হল মডিউলটি ব্যবহার করা। মডিউলগুলি সাধারণত আন্তরিকভাবে একটি সমস্যা সমাধানের চেষ্টা করে এবং প্রায়শই বজায় থাকে। এগুলি এনপিএম সহ আপনি সহজেই আপডেট করতে পারেন। এছাড়াও, আপনার বিশেষত fs.exists [সিঙ্ক] ব্যবহার করা এড়ানো উচিত কারণ এর ব্যবহারের বর্ণের অবস্থা বোঝায়।
1j01

16
@ 1j01 প্ল্যাটফর্মটি স্থানীয়ভাবে অপারেশনকে সমর্থন করে যদি সঠিক উপায় হ'ল মডিউল ব্যবহার করা আমি বিশ্বাস করি না। এটাই বিশৃঙ্খলার রাস্তা। প্রযুক্তিগত দৃষ্টিকোণ থেকে আরও ভাল উত্তর আছে তা আমাকে সম্মত করতে হবে।
সি ..

2
@ 1j01 এছাড়াও, সিঙ্ক অপারেশনগুলি ব্যবহার করে রেস শর্তাদি বোঝায় কারণ তাদের ব্যবহার তাদের কাছে একটি রেজোলিউশন।
সি ..

193

সম্পাদনা: যেহেতু এই উত্তরটি খুব জনপ্রিয়, আমি আপ-টু-ডেট অনুশীলনগুলি প্রতিবিম্বিত করতে এটি আপডেট করেছি।

নোড> = 10

{ recursive: true }নোডের নতুন বিকল্পটি fsএটিকে স্থানীয়ভাবে অনুমতি দেয়। এই বিকল্পটি ইউনিক্সের আচরণের নকল করে mkdir -p। এটি পুনরাবৃত্তভাবে নিশ্চিত করে তুলবে যে পথের প্রতিটি অংশ বিদ্যমান আছে এবং যদি তাদের কোনওটি করা হয় তবে কোনও ত্রুটি ছুঁড়বে না।

(দ্রষ্টব্য: এটি এখনও ত্রুটি ছুঁড়ে দিতে পারে যেমন EPERMবা EACCESSতাই, try {} catch (e) {}যদি আপনার বাস্তবায়ন এটির সংবেদনশীল হয় তবে আরও ভালভাবে এটি জড়ান))

সিঙ্ক্রোনাস সংস্করণ।

fs.mkdirSync(dirpath, { recursive: true })

অ্যাসিঙ্ক সংস্করণ

await fs.promises.mkdir(dirpath, { recursive: true })

পুরানো নোড সংস্করণ

একটি ব্যবহার করে try {} catch (err) {}, আপনি কোনও বর্ণের শর্তের মুখোমুখি না হয়ে খুব মনোযোগ দিয়ে এটি অর্জন করতে পারেন।

অস্তিত্ব অনুসন্ধানের জন্য এবং ডিরেক্টরি তৈরি করার মধ্যে মৃত সময়কে রোধ করার জন্য, আমরা কেবল এটিকে সরাসরি তৈরি করার চেষ্টা করি এবং যদি ত্রুটিটি থাকে EEXIST(ডিরেক্টরি ইতিমধ্যে বিদ্যমান) তবে তা উপেক্ষা করি ।

ত্রুটিটি যদি না হয় EEXISTতবে আমাদের ত্রুটি ছুঁড়ে ফেলা উচিত, কারণ আমরা একটি EPERMবা এর মতো কিছু নিয়ে কাজ করতে পারিEACCES

function ensureDirSync (dirpath) {
  try {
    return fs.mkdirSync(dirpath)
  } catch (err) {
    if (err.code !== 'EEXIST') throw err
  }
}

জন্য mkdir -p-একটি রিকার্সিভ আচরণ, যেমন ./a/b/c, আপনি dirpath প্রতিটি পক্ষ থেকে একে ডাকতে চাই, যেমন ./a, ./a/b,.a/b/c


var fs = Npm.require ('fs'); var dir = process.env.PWD + '/ ফাইল / ব্যবহারকারী /' + this.userId + '/'; চেষ্টা করুন {fs.mkdirSync (dir); } ধরা (e) {যদি (e.code! = 'EEXIS') নিক্ষেপ করুন ই; }
হারুন

আমি আপনার কোডটি চেষ্টা করেছি, একটি জেএস-স্ক্রিপ্ট তৈরি করেছি যা ক্যাটালগ তৈরির ব্যবহার করে: mkdirpSync (path.join (__ dirname, 'প্রথম', 'দ্বিতীয়', 'তৃতীয়', 'ওলোলল', 'ওয়ার্কস')); তবে এই ত্রুটিটি পেয়েছে: ode নোড 1.js fs.js: 747 রিটার্ন বাইন্ডিং mmkdir (pathModule._makeLong (পাথ)), ^ ত্রুটি: EPERM, অপারেশন অনুমোদিত নয় 'সি: \' এ ত্রুটি (নেটিভ) এ অবজেক্ট.এফএসে। mkdirSync (fs.js: 747: 18) at mkdirpSync (সি: \ ব্যবহারকারীগণ \ ম্যাক্সিম \ ডেস্কটপ \ পরীক্ষা \ 1.js: 15: 8) অবজেক্টে an 1.js: 19: 1) ... আপনি কী ভুল হতে পারে তা বলতে পারবেন? উইন্ডোতে স্পষ্টতই ব্যবহৃত হয়েছে :)
এলেঞ্জারফ

ইপিআরএম কোনও অনুমতি ইস্যু বলে মনে হচ্ছে, সুতরাং স্ক্রিপ্টটি যেভাবেই ফাঁসি কার্যকর হতে পারে
ক্রিস্টোফ মারোইস

আমি মনে করি এটি আরও ভাল হবে: var mkdirpSync = ফাংশন (dirpath) {var অংশ = dirpath.split (path.sep); (var i = 1; i <= parts.length; i++) {চেষ্টা করুন {fs.mkdirSync (path.join.apply (নাল, অংশ.স্লাইস (0, i))); } ধরা (ত্রুটি) {যদি (ত্রুটি কোড)! '' এক্সএক্সআইএসটি ') {ত্রুটি ছুঁড়ে; }}}}
মণীশ

1
সতর্কতা: এটা না কাজ আপনার পাথ একটি দিয়ে শুরু হয় যদি / না
acemtp

62

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

fs.existsSync("directory") || fs.mkdirSync("directory");


7
fs.existsSync (...) অবচয় করা হয়নি, তবে এই উত্তরটি ঠিক আছে বলে মনে হচ্ছে।
ড্যান হায়উড

মাথা উঁচু করে! "দির / ফু / বার" এর জন্য কাজ করবে না যার অর্থ mkdir -p পতাকা বৈশিষ্ট্য নেই
কার্ল পোকাস

এটির একটি রেস শর্তও রয়েছে
এভার্ট

26

নোড.জেএস ডক্স fs.mkdirমূলত লিনাক্স ম্যান পৃষ্ঠাটির জন্য মুলতবি করতে mkdir(2)। এটি নির্দেশ করে যে EEXISTপথটি উপস্থিত থাকলেও এটি নির্দেশ করা হবে তবে আপনি যদি এই রুটটিতে যান তবে কোনও ডিরেক্টরি নয় যা একটি বিশ্রী কোণার কেস তৈরি করে।

আপনি কল করা ভাল হতে পারে fs.statযা আপনাকে জানিয়ে দেবে যে পথটি রয়েছে কিনা এবং যদি এটি একটি কলের কোনও ডিরেক্টরি। (আমি যা ধরে নিচ্ছি) এটির ক্ষেত্রে স্বাভাবিক ডিরেক্টরি যেখানে ডিরেক্টরি ইতিমধ্যে বিদ্যমান রয়েছে, এটি কেবলমাত্র একটি একক ফাইল সিস্টেম হিট।

এই fsমডিউল পদ্ধতিগুলি দেশীয় সি এপিআইগুলির চারপাশে পাতলা মোড়কযুক্ত যাতে বিশদগুলির জন্য আপনাকে নোড.জেএস ডক্সে উল্লেখ করা ম্যান পৃষ্ঠাগুলি পরীক্ষা করতে হবে।


19
statআগে কল করা mkdirএকটি রেসের শর্তের সম্ভাবনা রয়েছে - এটি মনে রাখবেন।
রজার লিপসক্বে

24

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

if(!fs.existsSync("directory")){
    fs.mkdirSync("directory", 0766, function(err){
        if(err){
            console.log(err);
            // echo the result back
            response.send("ERROR! Can't make the directory! \n");
        }
    });
}

1
-1। আমি বিশ্বাস করি না যে এটি কাজ করে, statSyncকোডটি ক্র্যাশ করে সত্তাটির কোনও অস্তিত্ব না থাকলে ত্রুটি ছুঁড়ে দেব। আপনার এটি একটি try/catchব্লকে মোড়ানো প্রয়োজন ।
ক্রিস ফস্টার

2
দুঃখিত আমি ভুল. "বিদ্যমানসিনকি" এর জন্য "স্ট্যাটাসিনিক" পরিবর্তন করুন
রাউগারাল

5
Nodejs.org/api/fs.html#fs_fs_mkdirsync_path_mode অনুসারে এমকেডির সিঙ্ক রূপটি কলব্যাক গ্রহণ করে না
ড্যানওয়েলম্যান

1
Nodejs.org/api/fs.html#fs_fs_existssync_path অনুসারে , fs.existsSync()এবং অবচয় করাfs.exists() হবে।
pau.moreno

7

আমি মডিউলগুলি ছাড়াই একটি সমাধানের প্রস্তাব দিই (মডিউলগুলি সংগ্রহের জন্য বিশেষত ছোট ফাংশনগুলির জন্য যা কয়েক লাইনে লেখা যায় ...

সর্বশেষ আপডেট :

V10.12.0 এ, নোডজেএস সম্পূর্ণকরণ পুনরাবৃত্তির বিকল্পগুলি:

// Create recursive folder
fs.mkdir('my/new/folder/create', { recursive: true }, (err) => { if (err) throw err; });

হালনাগাদ :

// Get modules node
const fs   = require('fs');
const path = require('path');

// Create 
function mkdirpath(dirPath)
{
    if(!fs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK))
    {
        try
        {
            fs.mkdirSync(dirPath);
        }
        catch(e)
        {
            mkdirpath(path.dirname(dirPath));
            mkdirpath(dirPath);
        }
    }
}

// Create folder path
mkdirpath('my/new/folder/create');

fs.exists()নোড v9 এ অবচয় করা হয়েছে। fs.access()পরিবর্তে ব্যবহার করুন। ( undefinedফাইল উপস্থিত থাকলে ফিরিয়ে দেয়; অন্যথায় ত্রুটি ছুঁড়ে ফেলে ENOENT)
ছারভে

কোনও এনপিএম প্যাকেজ ছাড়া এটি কাজ করছে। এটি একটি মূল্যবান কোড। ধন্যবাদ
কার্তিক শ্রীধরণ

বিদ্যমান দীর্ঘ পথের অধীনে একটি ফোল্ডার তৈরি করার জন্য এটি বেশ ভাল;) ধন্যবাদ, মানুষ man
Tsung Goh

1
কি হবে fs.mkdirSync('my/new/folder/create', {recursive: true})?
14

ধন্যবাদ! আমি অন্যদের সাহায্য করার জন্য আমার পোস্ট আপডেট করি। নোড 10.12.0 খুব সাম্প্রতিক ছিল।
লিবারেটর

4

আপনি এফএস-এক্সট্রাও ব্যবহার করতে পারেন যা প্রচুর ঘন ঘন ব্যবহৃত ফাইল অপারেশন সরবরাহ করে।

কোডের উদাহরণ:

var fs = require('fs-extra')

fs.mkdirs('/tmp/some/long/path/that/prob/doesnt/exist', function (err) {
  if (err) return console.error(err)
  console.log("success!")
})

fs.mkdirsSync('/tmp/another/path')

ডক্স এখানে: https://github.com/jprichardson/node-fs-extra#mkdirsdir-callback


4

এখানে ES6 কোডটি যা আমি ডিরেক্টরি তৈরি করতে ব্যবহার করি (যখন এটি বিদ্যমান নেই):

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

function createDirectory(directoryPath) {
  const directory = path.normalize(directoryPath);

  return new Promise((resolve, reject) => {
    fs.stat(directory, (error) => {
      if (error) {
        if (error.code === 'ENOENT') {
          fs.mkdir(directory, (error) => {
            if (error) {
              reject(error);
            } else {
              resolve(directory);
            }
          });
        } else {
          reject(error);
        }
      } else {
        resolve(directory);
      }
    });
  });
}

const directoryPath = `${__dirname}/test`;

createDirectory(directoryPath).then((path) => {
  console.log(`Successfully created directory: '${path}'`);
}).catch((error) => {
  console.log(`Problem creating directory: ${error.message}`)
});

বিঃদ্রঃ:

  • createDirectoryক্রিয়াকলাপের শুরুতে, গ্যারান্টির জন্য আমি গতিপথটিকে স্বাভাবিক করি যে অপারেটিং সিস্টেমের পাথ সেপারেটর ধরণের ধারাবাহিকভাবে ব্যবহৃত হবে (উদাঃ এটি রূপান্তরিত C:\directory/testহবে C:\directory\test(উইন্ডোজ থাকা অবস্থায়)
  • fs.existsহ্রাস করা হয়েছে , এজন্য আমি fs.statডিরেক্টরিটি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করতে ব্যবহার করি
  • যদি কোনও ডিরেক্টরি উপস্থিত না থাকে তবে ত্রুটি কোডটি হবে ENOENT( E rror NO ENT ry)
  • ডিরেক্টরিটি নিজেই ব্যবহার করে তৈরি করা হবে fs.mkdir
  • আমি এটি সমকক্ষকে fs.mkdirঅবরুদ্ধ করার চেয়ে অ্যাসিনক্রোনাস ফাংশনটি পছন্দ করি fs.mkdirSyncএবং মোড়ক দেওয়ার কারণে Promiseএটি নিশ্চিত করা হবে যে ডিরেক্টরিটি সফলভাবে ডিরেক্টরি তৈরি করার পরে ডিরেক্টরিটির পথটিই ফিরে আসবে only

অপ্রয়োজনীয় মডিউলগুলিতে জড়িত না এমন একটি পরিষ্কার সমাধানের জন্য আপনাকে ধন্যবাদ। এটা আমার জন্য পুরোপুরি কাজ করেন। আমি আরও উত্তর এই মত ছিল!
কেন লিয়ন

3

আমার মতে জাভাস্ক্রিপ্টে কোড দেওয়ার সময় ফাইল সিস্টেমের হিটগুলি না গণ্য করাই ভাল better তবে, (1) statএবং mkdirএবং (2) mkdirএবং ত্রুটি কোডটি চেক (বা বাতিল) করুন, উভয় উপায়ই যা চান তা করার সঠিক উপায়।


-1, আমি দেখতে পাচ্ছি না যে কীভাবে চেক করা বা বাতিল করা দুটোই এটির সঠিক উপায় হতে পারে। এটি বেশ উত্তর একটি উত্তর।
ম্যাট বল

ডিরেক্টরিকে এমকিডির করা বা বিদ্যমান একটি ব্যবহারের এটি ভাল উপায়। আপনি দেখতে পাচ্ছেন না কেন আমি তা দেখতে পাচ্ছি না। ত্রুটি কোডটি যাচাই করা খুব নম্র, তবে ত্রুটি কোডটি বাতিল করা কেবল একটি ভাল। আপনি একমত না?
চুল-ওওং ইয়াং

1
হতে পারে এটি একটি ভাষা বাধা সমস্যা, তবে আমি ওপি জিজ্ঞাসা করছে এমন প্রশ্নের উত্তর না দিয়েই এটি পড়েছি।
ম্যাট বল

আমি তোমার বক্তব্য কি তবে আমি বিশ্বাস করি যে জিনিসগুলি সঠিকভাবে করার অনেকগুলি উপায় রয়েছে are ধন্যবাদ।
চুল-ওওং ইয়াং

2

প্রতিটি ব্যবহারকারীর জন্য গতিশীল নাম ডিরেক্টরি তৈরি করুন ... এই কোডটি ব্যবহার করুন

***suppose email contain user mail address***

var filessystem = require('fs');
var dir = './public/uploads/'+email;

if (!filessystem.existsSync(dir)){
  filessystem.mkdirSync(dir);

}else
{
    console.log("Directory already exist");
}

1

আপনি ফাইল সিস্টেম মডিউল দিয়ে এই সমস্ত করতে পারেন।

const
  fs = require('fs'),
  dirPath = `path/to/dir`

// Check if directory exists.
fs.access(dirPath, fs.constants.F_OK, (err)=>{
  if (err){
    // Create directory if directory does not exist.
    fs.mkdir(dirPath, {recursive:true}, (err)=>{
      if (err) console.log(`Error creating directory: ${err}`)
      else console.log('Directory created successfully.')
    })
  }
  // Directory now exists.
})

ডিরেক্টরিটি বিদ্যমান কিনা তা আপনার সত্যিকারের এমনকি পরীক্ষা করার প্রয়োজন নেই। নিম্নলিখিত কোডটি গ্যারান্টি দেয় যে ডিরেক্টরিটি ইতিমধ্যে উপস্থিত রয়েছে বা তৈরি হয়েছে।

const
  fs = require('fs'),
  dirPath = `path/to/dir`

// Create directory if directory does not exist.
fs.mkdir(dirPath, {recursive:true}, (err)=>{
  if (err) console.log(`Error creating directory: ${err}`)
  // Directory now exists.
})

0

রাগরালের উত্তর কিন্তু -p কার্যকারিতা সহ। কুরুচিপূর্ণ, কিন্তু এটি কার্যকর:

function mkdirp(dir) {
    let dirs = dir.split(/\\/).filter(asdf => !asdf.match(/^\s*$/))
    let fullpath = ''

    // Production directory will begin \\, test is on my local drive.
    if (dirs[0].match(/C:/i)) {
        fullpath = dirs[0] + '\\'
    }
    else {
        fullpath = '\\\\' + dirs[0] + '\\'
    }

    // Start from root directory + 1, build out one level at a time.
    dirs.slice(1).map(asdf => {
        fullpath += asdf + '\\'
        if (!fs.existsSync(fullpath)) {
            fs.mkdirSync(fullpath)
        }
    })
}//mkdirp

0

ঠিক তেমু ইকোনেনের উত্তরের একটি নতুন বিকল্প , যা খুব সহজ এবং সহজেই পঠনযোগ্য, প্যাকেজের ensureDirপদ্ধতিটি ব্যবহার করা fs-extra

এটি কেবল বিল্ট ইন fsমডিউলটির জন্য অস্পষ্ট প্রতিস্থাপন হিসাবে ব্যবহার করা যায় না , তবে fsপ্যাকেজের কার্যকারিতা ছাড়াও আরও অনেক কার্যকারিতা রয়েছে ।

ensureDirপদ্ধতি, নাম হিসাবে সুপারিশ, নিশ্চিত করে যে ডিরেক্টরির বিদ্যমান। ডিরেক্টরি কাঠামো বিদ্যমান না থাকলে এটি তৈরি করা হয়। লাইক mkdir -p। কেবল শেষ ফোল্ডার নয়, এর পরিবর্তে পুরো পথটি ইতিমধ্যে বিদ্যমান না থাকলে তৈরি করা হবে।

উপরোক্ত একটি asyncএটির সংস্করণ। পদ্ধতি আকারে এটি সম্পাদন করার জন্য এটিতে একটি সিঙ্ক্রোনাস ensureDirSyncপদ্ধতিও রয়েছে।


0

@ লিবারেটরের উত্তর আমার পক্ষে কার্যকর হয়নি (নোড ভি 8.10.0)। সামান্য পরিবর্তনটি কৌশলটি করেছে তবে আমি নিশ্চিত নই যে এটি একটি সঠিক উপায় কিনা। সুপারিশ করুন.

// Get modules node
const fs   = require('fs');
const path = require('path');

// Create
function mkdirpath(dirPath)
{
    try {
        fs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);
    }
    catch(err) {
        try
        {
            fs.mkdirSync(dirPath);
        }
        catch(e)
        {
            mkdirpath(path.dirname(dirPath));
            mkdirpath(dirPath);
        }
    }
}

// Create folder path
mkdirpath('my/new/folder/create');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.