ডিরেক্টরি যদি নোড.জেএস ব্যবহার করে না থাকে তবে কীভাবে তৈরি করবেন?


650

ডিরেক্টরি উপস্থিত না থাকলে এটি কি সঠিক উপায়? এটির স্ক্রিপ্টের সম্পূর্ণ অনুমতি এবং অন্যের দ্বারা পঠনযোগ্য হওয়া উচিত।

var dir = __dirname + '/upload';
if (!path.existsSync(dir)) {
    fs.mkdirSync(dir, 0744);
}

উত্তর:


1271
var fs = require('fs');
var dir = './tmp';

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

28
আপনি যদি অ্যাপ্লিকেশন বুট বা প্রারম্ভিককরণে এই ক্রিয়াকলাপটি সম্পাদন করে থাকেন তবে কার্যকর না হওয়া যেমন কার্যকর আপনি একই কাজটি করতেন ঠিক তেমন কাজ করা যদি আপনার এটি অসম্পূর্ণ করতে হয়। আপনি যদি পুনরাবৃত্ত ক্রিয়াকলাপ হিসাবে কোনও ডিরেক্টরি তৈরি করে থাকেন তবে এর খারাপ অনুশীলনটি সম্ভবত কোনও পারফরম্যান্সের সমস্যা সৃষ্টি করবে না, তবে এটি একটি খারাপ অভ্যাস কিছুটা কম নয়। কেবলমাত্র আপনার অ্যাপ্লিকেশন বুট করার জন্য বা অন্যথায় এক সময়ের ক্রিয়াকলাপ ব্যবহার করুন।
tsturzl

20
অ্যাটেন্ডসিঙ্ক () অবচিত নয়, বিদ্যমান () যদিও - nodejs.org/api/fs.html#fs_fs_existssync_path
আয়ান চাদউইক

* Syncপদ্ধতিগুলি ব্যবহার করা সাধারণত একটি নো:
হ'ল

14
স্থানীয় স্ক্রিপ্টগুলির জন্য সিঙ্ক পদ্ধতিগুলি এটির মতো এবং এ জাতীয়, অবশ্যই কোনও সার্ভারের পক্ষে ভাল ধারণা নয়।
পিয়ার

যদি সেই ব্লকটি সেটটাইমআউট দ্বারা বেষ্টিত থাকে তবে এটি অ্যাসিঙ্ক .....................
ব্রায়ান গ্রেস

185

না, একাধিক কারণে

  1. pathমডিউল একটি নেই exists/ existsSyncপদ্ধতি। এটি fsমডিউলে রয়েছে। (সম্ভবত আপনি আপনার প্রশ্নে টাইপ করেছেন?)

  2. ডকস স্পষ্টভাবে আপনাকে ব্যবহার থেকে নিরুৎসাহিত করে exists

    fs.exists()একটি অ্যানক্রোনজম এবং এটি কেবল historicalতিহাসিক কারণে বিদ্যমান। এটি নিজের কোডে ব্যবহার করার কারণ নেই almost

    বিশেষত, ফাইলটি খোলার আগে উপস্থিত রয়েছে কিনা তা পরীক্ষা করা একটি অ্যান্টি-প্যাটার্ন যা আপনাকে জাতিগত অবস্থার জন্য ঝুঁকির মধ্যে ফেলে: অন্য কোনও প্রক্রিয়া কল fs.exists()এবং এর মধ্যে ফাইলটিকে সরিয়ে ফেলতে পারে fs.open()। কেবল ফাইলটি খুলুন এবং ত্রুটিটি সেখানে উপস্থিত না হলে পরিচালনা করুন।

    যেহেতু আমরা একটি ফাইলের পরিবর্তে ডিরেক্টরি সম্পর্কে কথা বলছি, এই পরামর্শটি বোঝায় যে আপনার কেবল শর্তযুক্ত কল করা mkdirএবং উপেক্ষা করা উচিত EEXIST

  3. সাধারণভাবে, আপনার * Syncপদ্ধতিগুলি এড়ানো উচিত । তারা অবরুদ্ধ করছে, যার অর্থ আপনি ডিস্কে যাওয়ার সময় আপনার প্রোগ্রামের আর কিছুই ঘটতে পারে না। এটি একটি খুব ব্যয়বহুল অপারেশন, এবং নোডের ইভেন্ট লুপটির মূল অনুমানটি ভেঙে যাওয়ার সময়টি।

    * Syncপদ্ধতিগুলি একক-উদ্দেশ্যমূলক দ্রুত স্ক্রিপ্টগুলিতে সাধারণত সূক্ষ্ম হয় (সেগুলি যা একটি কাজ করে এবং তারপরে প্রস্থান করে) তবে আপনি যখন সার্ভারটি লিখছেন তখন কখনই ব্যবহার করা উচিত নয়: আপনার সার্ভার পুরো সময়কালে কারও প্রতিক্রিয়া জানাতে অক্ষম হবে I / O অনুরোধগুলির। যদি একাধিক ক্লায়েন্টের অনুরোধের I / O ক্রিয়াকলাপগুলির প্রয়োজন হয় তবে আপনার সার্ভারটি খুব দ্রুত থামতে হবে ha


    আমি যখন Syncসার্ভার অ্যাপ্লিকেশনটিতে * পদ্ধতিগুলি ব্যবহার করার বিষয়টি বিবেচনা করব তখন একবারে (এবং কেবল একবারেই) একবার সঞ্চালনের সময় ঘটে operation উদাহরণস্বরূপ, মডিউলগুলি লোড করতে require আসলে ব্যবহারreadFileSync করে।

    তারপরেও, আপনাকে এখনও সতর্ক থাকতে হবে কারণ প্রচুর সিঙ্ক্রোনাস I / O অকারণে আপনার সার্ভারের প্রারম্ভকালীন সময়কে ধীর করতে পারে।


    পরিবর্তে, আপনার অ্যাসিনক্রোনাস আই / ও পদ্ধতি ব্যবহার করা উচিত।

সুতরাং আমরা যদি সেই পরামর্শগুলির টুকরাগুলি একসাথে রাখি তবে আমরা এরকম কিছু পাই:

function ensureExists(path, mask, cb) {
    if (typeof mask == 'function') { // allow the `mask` parameter to be optional
        cb = mask;
        mask = 0777;
    }
    fs.mkdir(path, mask, function(err) {
        if (err) {
            if (err.code == 'EEXIST') cb(null); // ignore the error if the folder already exists
            else cb(err); // something else went wrong
        } else cb(null); // successfully created folder
    });
}

এবং আমরা এটি এর মতো ব্যবহার করতে পারি:

ensureExists(__dirname + '/upload', 0744, function(err) {
    if (err) // handle folder creation error
    else // we're all good
});

অবশ্যই, এটি প্রান্তের মতো মামলার জন্য অ্যাকাউন্ট করে না

  • আপনার প্রোগ্রামটি চলাকালীন ফোল্ডারটি মুছে ফেলা হলে কী হবে? (ধরে নিলে আপনি কেবল এটি শুরুর সময় একবারেই উপস্থিত আছেন কিনা তা পরীক্ষা করে দেখুন)
  • যদি ফোল্ডারটি ইতিমধ্যে উপস্থিত থাকে তবে ভুল অনুমতি নিয়ে কী ঘটে?

1
সিনট্যাক্সেরর এড়ানোর কোনও উপায় আছে: কড়া মোডে অক্টাল আক্ষরিক অনুমতি নেই?
শুক্রবার

8
দশমিক হিসাবে এটি লিখুন। 0744 == 484
josh3736

3
বিকল্পটি হ'ল github.com/jprichardson/node-fs-extra
ব্রেট

এই "মাস্ক" পতাকাটি কি এখনও 2019 সালে প্রাসঙ্গিক? এর উদ্দেশ্য কী ছিল?
ওল্ডবয়

এটি ইউনিক্স ফাইল মোড - ডিরেক্টরিটির পড়ার / লেখার অনুমতি।
josh3736

44

আমি খুঁজে পেয়েছি এবং এনপিএম মডিউল যা এর জন্য কবজির মতো কাজ করে। এটি যখন প্রয়োজন হয় তখন কেবল পুনরাবৃত্তভাবে mkdir করে, যেমন "এমকেডির-পি"।

https://www.npmjs.com/package/mkdirp


33

mkdirপদ্ধতি করার ক্ষমতা থাকবে যাও recursively তৈরি একটি পাথ না যে বিদ্যমান যে কোন ডিরেক্টরি, এবং বেশী যে উপেক্ষা করি।

থেকে নোড V10 / 11 ডক্স :

// 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প্রথমে বিল্ট-ইন মডিউলটি আমদানি করতে হবে ।

এখন এখানে আরও কয়েকটি দৃ example় উদাহরণ যা নেটিভ ইএস মডিউলগুলি (ফ্ল্যাগ সক্ষম ও .mjs এক্সটেনশন সহ) উপার্জন করে, অ-রুট পাথগুলি পরিচালনা করে এবং পুরো পথের নামগুলির জন্য অ্যাকাউন্টগুলি:

import fs from 'fs';
import path from 'path';

createDirectories(pathname) {
   const __dirname = path.resolve();
   pathname = pathname.replace(/^\.*\/|\/?[^\/]+\.[a-z]+|\/$/g, ''); // Remove leading directory markers, and remove ending /file-name.extension
   fs.mkdir(path.resolve(__dirname, pathname), { recursive: true }, e => {
       if (e) {
           console.error(e);
       } else {
           console.log('Success');
       }
    });
}

আপনি এটি ব্যবহার করতে পারেন createDirectories('/components/widget/widget.js');

এবং অবশ্যই, আপনি সম্ভবত async এর সাথে প্রতিশ্রুতি ব্যবহার করে / ডিরেক্টরিগুলি তৈরি হওয়ার সময় আরও বেশি পঠনযোগ্য সিঙ্ক্রোনাস-চেহারা পদ্ধতিতে ফাইল তৈরির জন্য অপেক্ষা করতে চেয়ে আরও অভিনবতা পেতে চান; কিন্তু, এটি প্রশ্নের ক্ষেত্রের বাইরে।


1
কেন কনস্ট __dirname = path.resolve (); এবং অন্তর্নির্মিত __ ডিরেক্টরি ব্যবহার করবেন না?
তমুসজেরোয়েস


20

mkdirফোল্ডারটি উপস্থিত থাকলে আপনি কেবল ত্রুটিটি ব্যবহার করতে এবং ধরতে পারেন।
এটি async (তাই সেরা অনুশীলন) এবং নিরাপদ।

fs.mkdir('/path', err => { 
    if (err && err.code != 'EEXIST') throw 'up'
    .. safely do your stuff here  
    })

(Ptionচ্ছিকভাবে মোডের সাথে একটি দ্বিতীয় যুক্তি যুক্ত করুন))


অন্যান্য চিন্তা:

  1. আপনি তখন ব্যবহার করতে পারেন বা দেশীয় প্রতিশ্রুতি ব্যবহার করে অপেক্ষা করতে পারেন ।

    const util = require('util'), fs = require('fs');
    const mkdir = util.promisify(fs.mkdir);
    var myFunc = () => { ..do something.. } 
    
    mkdir('/path')
        .then(myFunc)
        .catch(err => { if (err.code != 'EEXIST') throw err; myFunc() })
  2. আপনি নিজের প্রতিশ্রুতি পদ্ধতিটি তৈরি করতে পারেন, এর মতো কিছু (অনির্ধারিত):

    let mkdirAsync = (path, mode) => new Promise(
       (resolve, reject) => mkdir (path, mode, 
          err => (err && err.code !== 'EEXIST') ? reject(err) : resolve()
          )
       )
  3. সিঙ্ক্রোনাস চেকিংয়ের জন্য, আপনি ব্যবহার করতে পারেন:

    fs.existsSync(path) || fs.mkdirSync(path)
  4. অথবা আপনি একটি লাইব্রেরি ব্যবহার করতে পারেন, দুটি সবচেয়ে জনপ্রিয় সত্তা

    • mkdirp (কেবল ফোল্ডারগুলি করে)
    • fsextra (সুপারসেটস এফএস, প্রচুর দরকারী স্টাফ যুক্ত করে)

1
প্রতিশ্রুতিবদ্ধ পদ্ধতির জন্য # 1, আপনি ধরাটি পুনরায় ব্যবস্থা করতে পারেন। mkdir('/path').catch(err => { if (err.code != 'EEXIST') throw err;}).then(myFunc);
হোয়াট কুল

এবং এর !==পরিবর্তে ব্যবহার করুন!=
কুইন্টিন রায়

18

সঙ্গে FS-অতিরিক্ত প্যাকেজ আপনার সাথে এটা করতে পারেন একটি এক মাছ ধরার নৌকা :

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

const dir = '/tmp/this/path/does/not/exist';
fs.ensureDirSync(dir);

এমন আন্ডাররেটেড উত্তর! fs-extra আমার কাছে অবশ্যই একটি ব্যাসাম রয়েছে। আমার মনে হয় যে কোনও ফোল্ডার রয়েছে কিনা তা যাচাই করার জন্য 10+ লাইন লিখতে এটি একটি বিভ্রান্তি ...
538 রোমিয়

10

সবচেয়ে ভাল সমাধান হ'ল নোড-এফএস-এক্সট্রা নামক এনপিএম মডিউলটি ব্যবহার করা । এটির একটি পদ্ধতি রয়েছে mkdirযা আপনার উল্লিখিত ডিরেক্টরিটি তৈরি করে। আপনি যদি একটি দীর্ঘ ডিরেক্টরি পাথ দেন তবে এটি প্যারেন্ট ফোল্ডারগুলি স্বয়ংক্রিয়ভাবে তৈরি করবে। মডিউলটি এনপিএম মডিউলের একটি দুর্দান্ত সেট fs, সুতরাং আপনি fsএই মডিউলটি যুক্ত করলে আপনি সমস্ত ফাংশনও ব্যবহার করতে পারেন ।


6
var dir = 'path/to/dir';
try {
  fs.mkdirSync(dir);
} catch(e) {
  if (e.code != 'EEXIST') throw e;
}

4
নোড.জেএস ভি .4.৪.০ এর জন্য ডকুমেন্টেশনে বলা হয়েছে যে হ্রাস পেয়েছে fs.exists()তবে fs.existsSync()তা নয়। আপনি কি কোনও রিসোর্সের সাথে একটি লিঙ্ক যুক্ত করতে পারেন যা অবহিত হয়েছে fs.existsSync()?
ফ্রেঞ্চিস

1
ভবিষ্যতে এই প্রশ্নে আসা ব্যবহারকারীদের জন্য কেবল কোডের উত্তরগুলি খুব সহায়ক নয়। আপনার কোডটি কেন আসল সমস্যাটি সমাধান করে তা
বোঝাতে

3
@ ফ্রানসিস, হুম, আমি নোড.জেএস ভি 5
ডকস

1
ধন্যবাদ! দেখে মনে হয় যে ফাংশনটি 0.12 সংস্করণে বিদ্যমান ছিল, 4 এবং 5 সংস্করণে অবনতি পেয়েছে এবং সংস্করণ 6 এবং 7 এ পুনরুদ্ধার পেয়েছে ... একটি জম্বি ফাংশনটির মতো ...
ফ্রেঞ্চিস

1
হ্যাঁ, আপাতদৃষ্টিতে এটি এখন অবহিত নয়Apr 2018 : nodejs.org/api/fs.html#fs_fs_existssync_path
Leon - Han Li

5
    var filessystem = require('fs');
    var dir = './path/subpath/';

    if (!filessystem.existsSync(dir)){
        filessystem.mkdirSync(dir);
    }else
    {
        console.log("Directory already exist");
    }

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


5

উদ্দীপনা: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই

সমাধান

const fs = require('fs')  // in javascript
import * as fs from "fs"  // in typescript
import fs from "fs"       // in typescript

// it will create the directory if it does not exist.
!fs.existsSync(`./assets/`) && fs.mkdirSync(`./assets/`, { recursive: true })

1
এটি কাজ করছে, আপনাকে ধন্যবাদ
আলজাহান ইয়ামারো

3

আমি josh3736 এর উত্তরের একটি টাইপস্ক্রিপ্ট প্রতিশ্রুতি সংশোধক যুক্ত করতে চাই ।

এটি একই কাজ করে এবং একই প্রান্তের কেস রয়েছে, এটি কেবল প্রতিশ্রুতি, টাইপস্ক্রিপ্ট টাইপডেফগুলি ব্যবহার করতে ঘটে এবং "ব্যবহার কঠোর" সাথে কাজ করে।

// https://en.wikipedia.org/wiki/File_system_permissions#Numeric_notation
const allRWEPermissions = parseInt("0777", 8);

function ensureFilePathExists(path: string, mask: number = allRWEPermissions): Promise<void> {
    return new Promise<void>(
        function(resolve: (value?: void | PromiseLike<void>) => void,
            reject: (reason?: any) => void): void{
            mkdir(path, mask, function(err: NodeJS.ErrnoException): void {
                if (err) {
                    if (err.code === "EEXIST") {
                        resolve(null); // ignore the error if the folder already exists
                    } else {
                        reject(err); // something else went wrong
                    }
                } else {
                    resolve(null); // successfully created folder
                }
            });
    });
}

3

নোড 10 + ইএস 6 সহ:

import path from 'path';
import fs from 'fs';

(async () => {
  const dir = path.join(__dirname, 'upload');

  try {
    await fs.promises.mkdir(dir);
  } catch (error) {
    if (error.code === 'EEXIST') {
      // Something already exists, but is it a file or directory?
      const lstat = await fs.promises.lstat(dir);

      if (!lstat.isDirectory()) {
        throw error;
      }
    } else {
      throw error;
    }
  }
})();

2

আপনি নোড ব্যবহার করতে পারেন ফাইল সিস্টেম কমান্ড fs.stat যদি Dir বিদ্যমান এবং চেক করতে fs.mkdir কলব্যাক সঙ্গে একটি সংকলন তৈরি করা, অথবা fs.mkdirSync এই উদাহরণে মত কলব্যাক ছাড়া একটি সংকলন তৈরি করা:

//first require fs
const fs = require('fs');

// Create directory if not exist (function)
const createDir = (path) => {
    // check if dir exist
    fs.stat(path, (err, stats) => {
        if (stats.isDirectory()) {
            // do nothing
        } else {
            // if the given path is not a directory, create a directory
            fs.mkdirSync(path);
        }
    });
};

1

পুনরাবৃত্তভাবে ডিরেক্টরিগুলি তৈরি করতে এখানে একটি ছোট ফাংশন রয়েছে:

const createDir = (dir) => {
  // This will create a dir given a path such as './folder/subfolder' 
  const splitPath = dir.split('/');
  splitPath.reduce((path, subPath) => {
    let currentPath;
    if(subPath != '.'){
      currentPath = path + '/' + subPath;
      if (!fs.existsSync(currentPath)){
        fs.mkdirSync(currentPath);
      }
    }
    else{
      currentPath = subPath;
    }
    return currentPath
  }, '')
}

0

অ্যাসিঙ্ক ব্যবহার / অপেক্ষা করুন:

const mkdirP = async (directory) => {
  try {
    return await fs.mkdirAsync(directory);
  } catch (error) {
    if (error.code != 'EEXIST') {
      throw e;
    }
  }
};

আপনাকে প্রতিশ্রুতি দিতে হবে fs:

import nodeFs from 'fs';
import bluebird from 'bluebird';

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