ডিরেক্টরিটি সরান যা খালি নয় not


298

আমার নোড অ্যাপ্লিকেশনটিতে আমার একটি ডিরেক্টরি মুছে ফেলতে হবে যা কিছু ফাইল রয়েছে তবে fs.rmdirকেবল খালি ডিরেক্টরিতে কাজ করে। কিভাবে আমি এটি করতে পারব?


1
সংক্ষেপে: fs.readdir(dirPath)কোনও ফোল্ডারে পাথের অ্যারের জন্য, fs.unlink(filename)প্রতিটি ফাইল মোছার জন্য পুনরাবৃত্তি করুন এবং অবশেষে fs.rmdir(dirPath)এখন-খালি ফোল্ডারটি মোছার জন্য। আপনার যদি পুনরাবৃত্তি দরকার হয় তবে চেক করুন fs.lstat(filename).isDirectory()
আয়নো

উত্তর:


319

এটির জন্য একটি মডিউল রয়েছে rimraf( https://npmjs.org/package/rimraf )। এটি একই কার্যকারিতা সরবরাহ করেrm -Rf

অ্যাসিঙ্ক ব্যবহার:

var rimraf = require("rimraf");
rimraf("/some/directory", function () { console.log("done"); });

সিঙ্ক ব্যবহার:

rimraf.sync("/some/directory");

1
আশ্চর্যের বিষয়, আমি এরকম আচরণ কখনও দেখিনি। আমি অনুসন্ধান করতে এবং / অথবা একটি বাগ ফাইল করার পরামর্শ দিই। github.com/isaacs/rimraf/issues
মরগান এআরআর অ্যালেন

35
এটি এমন কিছু যা নোডেজেএস কোর দিয়ে সহজেই করা যায় কেন একটি অনিচ্ছাকৃত তৃতীয় পক্ষের প্যাকেজ ইনস্টল করবেন?
সুডোকিড

4
@ এমটিএসপিয়ার আপনি কখনই "সহজেই সম্পন্ন করা" বলতে চান? স্বরূপ একটি ফাংশন লিখেছেন deleteFolderRecursiveনীচের উত্তর হিসাবে?
ফ্রিউইন্ড

23
"তবে এটির নীচের ফাংশনটির পরেও আপনার সিস্টেমে একটি বিনা শোধিত প্যাকেজ যুক্ত করুন। আমি দৃ strongly়ভাবে একমত না। একেবারেই কোনও কারণ ছাড়াই আপনি 19 মিলিয়ন বারের জন্য চাকাটি পুনরায় উদ্ভাবন করছেন, এবং প্রক্রিয়াটিতে বাগ বা সুরক্ষিত দুর্বলতাগুলির ঝুঁকি নিয়ে ঝুঁকিপূর্ণ। খুব কম সময়ে এটি সময় নষ্ট। ইনব 4 "তারা যদি প্যাকেজটি ফেলে দেয় তবে কী হবে": এনএমপি রেজিস্ট্রি থেকে প্যাকেজটি সরিয়ে ফেলা হয়েছে এমন অত্যন্ত সম্ভাবনাময় ইভেন্টে আপনি তারপরে সর্বদা এটি নিজের জায়গায় প্রতিস্থাপন করতে পারেন আপনার মাথাটি ভেঙে যাওয়ার আগে আপনার মাথা বেঁধে দেওয়ার কোনও অর্থ নেই।
ডেমোনব্ল্যাক

3
আপনি এখন একজন ব্যবহার করতে পারেন recursive: বিকল্প stackoverflow.com/a/57866165/6269864

243

একযোগে ফোল্ডার অপসারণ করতে

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

const deleteFolderRecursive = function(path) {
  if (fs.existsSync(path)) {
    fs.readdirSync(path).forEach((file, index) => {
      const curPath = Path.join(path, file);
      if (fs.lstatSync(curPath).isDirectory()) { // recurse
        deleteFolderRecursive(curPath);
      } else { // delete file
        fs.unlinkSync(curPath);
      }
    });
    fs.rmdirSync(path);
  }
};

33
এমন কিছু চেক যোগ করতে পারে যা আপনি '/' এ দুর্ঘটনাক্রমে চালাচ্ছেন না। উদাহরণস্বরূপ, একটি ফাঁকা পথ এবং ফাইলে একটি টাইপো পাস করার ফলে কারপ্যাথটি মূল ডিয়ার হতে পারে।
জেকহোওয়ার্ড

9
আরো জোরালো বাস্তবায়ন: প্রতিস্থাপন var curPath = path + "/" + file;সঙ্গে var curPath = p.join(path, file);প্রদান করা আপনি পাথ মডিউল অন্তর্ভূক্ত করেছেন:var p = require("path")
Andry

9
উইন্ডোজটির \ স্ল্যাশ রয়েছে, তাই এর path.join(dirpath, file)চেয়ে ভাল হওয়া উচিতpath + "/" + file
thybzi

5
এক টিক সময়ে অনেক বেশি ক্রিয়াকলাপের কারণে আপনি এই কোডটির সাথে "সর্বাধিক কল স্ট্যাকের আকারটি ছাড়িয়ে যেতে পারেন"। @ ওয়াল্ফ যদি আপনি কনসোল অ্যাপ্লিকেশন পরিচালনা করেন তবে আপনার 1 টি ক্লায়েন্ট রয়েছে, আরও কিছু নয়। সুতরাং, এই ক্ষেত্রে কনসোল অ্যাপ্লিকেশনটির জন্য
অ্যাসিঙ্ক

4
আমি পেয়েছি 'ত্রুটি: ENOTEMPTY: ডিরেক্টরি খালি নয়'
সিগল

167

fsনোড.জেএস ব্যবহার করে বেশিরভাগ লোকেরা ফাইলগুলি নিয়ে কাজ করার "ইউনিক্স ওয়ে" এর কাছাকাছি ফাংশন চান। আমি শীতল সমস্ত জিনিস আনতে fs- অতিরিক্ত ব্যবহার করছি :

এফএস-এক্সট্রা পদ্ধতিতে ভ্যানিলা নোড.জেএস এফএস প্যাকেজ অন্তর্ভুক্ত নয় এমন পদ্ধতি রয়েছে। যেমন mkdir -p, cp -r, এবং rm -rf।

আরও ভাল, fs- অতিরিক্ত হল নেটিভ fs এর প্রতিস্থাপনের ড্রপ। এফএস-এর সমস্ত পদ্ধতি অ-সংশোধিত এবং এর সাথে সংযুক্ত। এর অর্থ হল আপনি fs-অতিরিক্ত দ্বারা fs প্রতিস্থাপন করতে পারেন :

// this can be replaced
const fs = require('fs')

// by this
const fs = require('fs-extra')

এবং তারপরে আপনি এইভাবে কোনও ফোল্ডারটি মুছে ফেলতে পারেন:

fs.removeSync('/tmp/myFolder'); 
//or
fs.remove('/tmp/myFolder', callback);

আপনার প্রয়োজনীয় সিঙ্ক সংস্করণটির জন্যremoveSync('/tmp/myFolder')
অলিডেম

148

2019 পর্যন্ত ...

এর মতো Node.js 12.10.0 , fs.rmdirSyncএকটি সমর্থন recursive, বিকল্প যাতে আপনি পরিশেষে করতে পারেন:

fs.rmdirSync(dir, { recursive: true });

যেখানে recursiveঅপশনটি পুরো ডিরেক্টরিটিকে পুনরাবৃত্তভাবে মুছে দেয়।


5
@ এনেব এটি ঘটে যদি আপনি নোড.জেএস (<12.10) এর পুরানো সংস্করণ ব্যবহার করেন। সর্বশেষতম সংস্করণটি বিকল্পটিকে স্বীকৃতি দেয় recursive: trueএবং অভিযোগ ছাড়াই খালি খালি ফোল্ডারগুলি মুছে দেয়।
0

9
পুনরাবৃত্ত অপসারণ এখনও নোড v13.0.1 হিসাবে পরীক্ষামূলক
টিম

5
ফাংশনের স্বাক্ষরটি আসলে fs.rmdir(path[, options], callback)বাfs.rmdirSync(path[, options])
কনসেপ্টডেলাক্স

@ টিম পরীক্ষামূলক বলতে কী বোঝ?
আমেরিকা

2
@Emerica সরকারী সালে Node.js ডক্স একটি বড় কমলা প্রজ্ঞাপন বলছে নেই fs.rmdirস্থায়িত্ব 1. "স্থিতিশীলতার সঙ্গে পরীক্ষামূলক। 1 - পরীক্ষামূলক বৈশিষ্ট্য শব্দার্থিক ভারশনিং বিধি সাপেক্ষে নয় অ অনগ্রসর সামঞ্জস্যপূর্ণ পরিবর্তন বা অপসারণ কোন ঘটতে পারে। ভবিষ্যতে মুক্তি। উত্পাদন পরিবেশে বৈশিষ্ট্যটির ব্যবহারের প্রস্তাব দেওয়া হয় না। "
টিম

24

@Oconnecp থেকে আমার পরিবর্তিত উত্তর ( https://stackoverflow.com/a/25069828/3027390 )

আরও ভাল ক্রস প্ল্যাটফর্ম অভিজ্ঞতার জন্য path.join ব্যবহার করে। সুতরাং, এটি প্রয়োজন ভুলবেন না

var path = require('path');

এতে ফাংশনটির নতুন নামকরণও করা হয়েছে rimraf;)

/**
 * Remove directory recursively
 * @param {string} dir_path
 * @see https://stackoverflow.com/a/42505874/3027390
 */
function rimraf(dir_path) {
    if (fs.existsSync(dir_path)) {
        fs.readdirSync(dir_path).forEach(function(entry) {
            var entry_path = path.join(dir_path, entry);
            if (fs.lstatSync(entry_path).isDirectory()) {
                rimraf(entry_path);
            } else {
                fs.unlinkSync(entry_path);
            }
        });
        fs.rmdirSync(dir_path);
    }
}

17

আমি সাধারণত পুরানো থ্রেডগুলিকে পুনরুত্থিত করি না তবে এখানে প্রচুর মন্থর আছে এবং রিমরাফের উত্তরটি সান করেছে এটি আমার কাছে অত্যধিক জটিল বলে মনে হচ্ছে।

আধুনিক নোডে প্রথমে (> = v8.0.0) আপনি কেবল নোড কোর মডিউলগুলি ব্যবহার করে প্রক্রিয়াটি সহজ করতে পারেন, সম্পূর্ণ অবিচ্ছিন্ন এবং পাঁচটি লাইনের ফাংশনে একই সাথে সমস্ত ফাইলের লিঙ্ককে সমান্তরাল করতে পারেন এবং এখনও পাঠযোগ্যতা রাখতে পারেন:

const fs = require('fs');
const path = require('path');
const { promisify } = require('util');
const readdir = promisify(fs.readdir);
const rmdir = promisify(fs.rmdir);
const unlink = promisify(fs.unlink);

exports.rmdirs = async function rmdirs(dir) {
  let entries = await readdir(dir, { withFileTypes: true });
  await Promise.all(entries.map(entry => {
    let fullPath = path.join(dir, entry.name);
    return entry.isDirectory() ? rmdirs(fullPath) : unlink(fullPath);
  }));
  await rmdir(dir);
};

অন্য নোটে পথ ট্র্যাভারসাল আক্রমণগুলির জন্য একজন প্রহরী এই ফাংশনটির জন্য অনুপযুক্ত কারণ

  1. এটি একক দায়িত্ব নীতিমালার ভিত্তিতে সুযোগের বাইরে ।
  2. এই ফাংশনটি না করে কলার দ্বারা পরিচালনা করা উচিত । এটি কমান্ড-লাইনের অনুরূপ rm -rfযাতে এটি একটি আর্গুমেন্ট নেয় এবং ব্যবহারকারীকে rm -rf /জিজ্ঞাসা করার অনুমতি দেয় । কোনও স্ক্রিপ্টের দায়িত্ব হবে rmপ্রোগ্রামটি রক্ষা করা নয় ।
  3. রেফারেন্সের ফ্রেম না থাকায় এই ফাংশনটি এ জাতীয় আক্রমণ নির্ধারণ করতে অক্ষম হবে। আবার সেই আহ্বানকারীর দায়িত্ব হ'ল যার উদ্দেশ্যটির প্রসঙ্গ থাকবে যা এটি পথের ট্র্যাভারসালকে তুলনা করার জন্য একটি রেফারেন্স সরবরাহ করবে।
  4. Sym-লিঙ্ক একটি উদ্বেগের বিষয় হিসেবে নয় .isDirectory()হয় falsesym-লিঙ্ক এবং মধ্যে recursed না লিঙ্কমুক্ত হচ্ছে।

কিন্তু শেষ না অন্তত, একটি বিরল জাতি এই শর্তে যে পুনরাবৃত্তির যদি এন্ট্রি এক লিঙ্কমুক্ত বা মোছা হয়েছে ত্রুটি পারে বাহিরে যখন এই পুনরাবৃত্তির চলছে একেবারে সঠিক সময়ে এই স্ক্রিপ্টের। যেহেতু বেশিরভাগ পরিবেশে এই দৃশ্যটি সাধারণ নয়, সম্ভবত এটি উপেক্ষা করা যেতে পারে। তবে, প্রয়োজন হলে (কিছু প্রান্তের ক্ষেত্রে) এই সামান্য জটিল উদাহরণ সহ এই সমস্যাটি প্রশমিত করা যেতে পারে:

exports.rmdirs = async function rmdirs(dir) {
  let entries = await readdir(dir, { withFileTypes: true });
  let results = await Promise.all(entries.map(entry => {
    let fullPath = path.join(dir, entry.name);
    let task = entry.isDirectory() ? rmdirs(fullPath) : unlink(fullPath);
    return task.catch(error => ({ error }));
  }));
  results.forEach(result => {
    // Ignore missing files/directories; bail on other errors
    if (result && result.error.code !== 'ENOENT') throw result.error;
  });
  await rmdir(dir);
};

সম্পাদনা:isDirectory() একটি ফাংশন তৈরি করুন । শেষে ডিরেক্টরিটি সরান। অনুপস্থিত পুনরাবৃত্তি ঠিক করুন।


1
এটি সত্যই ঝরঝরে সমাধান। দ্বিতীয় কোড নমুনা সংক্রান্ত প্রশ্ন: আপনি কল না awaitআপনার Promise.all(…); এই ইচ্ছাকৃত হয়? দেখে মনে হচ্ছে এটির বর্তমান অবস্থায় results.forEachপ্রতিশ্রুতি দিয়ে পুনরাবৃত্তি হবে, যখন কোডটি ফলাফলের মাধ্যমে পুনরাবৃত্তি করবে বলে আশাবাদী। আমি কিছু অনুপস্থিত করছি?
আন্তন স্ট্রোগনফ

@ আপনি সঠিক হয়ে গেলে এটি টাইপো / বাগ। ভালো বল ধরা!
সুকিমা

ডিরেক্টরি উপস্থিত রয়েছে তা নিশ্চিত করার জন্য প্রথমে একটি চেক হতে পারে? কিছু এরকমif (!fs.existsSync(dir)) return
জিটিপিভি

@ জিটিপিভি কেন? এটি এই ফাংশনটির দায়িত্ব বৃদ্ধি করে। readdirএটি করা উচিত হিসাবে একটি ত্রুটি নিক্ষেপ করবে। যদি আপনি rmdir non-existing-dirপ্রস্থান কোড একটি ত্রুটি হয়। চেষ্টা / ধরার দায়িত্ব ভোক্তার হয়ে উঠবে। নোড ডক্সে বর্ণিত একই পদ্ধতিটি যখন fs ফাংশন ব্যবহার করার ক্ষেত্রে আসে। তারা আশা করে যে আপনি চেষ্টা করবেন / ধরবেন এবং codeকী করবেন তা নির্ধারণ করার জন্য ত্রুটিটি দেখুন । একটি অতিরিক্ত চেক একটি জাতি শর্ত পরিচয় করিয়ে দেয়।
সুকিমা

আমি অবশ্যই আপনার বক্তব্য দেখতে। যদিও আমি স্বজ্ঞাতভাবে আশা করব যে কোনও ফোল্ডারটি নেই যা মুছে ফেলার চেষ্টা করা সফল হবে কারণ এটি কেবল কিছুই করবে না it সিঙ্ক্রোনাস সংস্করণ fs.existsব্যবহার করা হলে কোন রেসের শর্ত নেই । পিএস এটি একটি দুর্দান্ত সমাধান।
জিটিপিভি

12

এখানে @ শার্পকোডার এর উত্তরের একটি অ্যাসিঙ্ক সংস্করণ

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

function deleteFile(dir, file) {
    return new Promise(function (resolve, reject) {
        var filePath = path.join(dir, file);
        fs.lstat(filePath, function (err, stats) {
            if (err) {
                return reject(err);
            }
            if (stats.isDirectory()) {
                resolve(deleteDirectory(filePath));
            } else {
                fs.unlink(filePath, function (err) {
                    if (err) {
                        return reject(err);
                    }
                    resolve();
                });
            }
        });
    });
};

function deleteDirectory(dir) {
    return new Promise(function (resolve, reject) {
        fs.access(dir, function (err) {
            if (err) {
                return reject(err);
            }
            fs.readdir(dir, function (err, files) {
                if (err) {
                    return reject(err);
                }
                Promise.all(files.map(function (file) {
                    return deleteFile(dir, file);
                })).then(function () {
                    fs.rmdir(dir, function (err) {
                        if (err) {
                            return reject(err);
                        }
                        resolve();
                    });
                }).catch(reject);
            });
        });
    });
};

10

আমি এই ফাংশনটি অপসারণ ফোল্ডার নামে লিখেছি। এটি এক অবস্থানের সমস্ত ফাইল এবং ফোল্ডারগুলি পুনরাবৃত্তভাবে মুছে ফেলবে। এটির প্রয়োজন কেবলমাত্র প্যাকেজ অ্যাসিঙ্ক।

var async = require('async');

function removeFolder(location, next) {
    fs.readdir(location, function (err, files) {
        async.each(files, function (file, cb) {
            file = location + '/' + file
            fs.stat(file, function (err, stat) {
                if (err) {
                    return cb(err);
                }
                if (stat.isDirectory()) {
                    removeFolder(file, cb);
                } else {
                    fs.unlink(file, function (err) {
                        if (err) {
                            return cb(err);
                        }
                        return cb();
                    })
                }
            })
        }, function (err) {
            if (err) return next(err)
            fs.rmdir(location, function (err) {
                return next(err)
            })
        })
    })
}

4
ধারণাটি আসলে আপনার নিজের কোডটি না লিখতে হবে যদি এটি ইতিমধ্যে অন্য কারও দ্বারা লেখা থাকে। এটি করার আরও ভাল উপায় হ'ল রিমরাফ বা এফএস-এক্সট্রা বা অন্য কোনও নোড মডিউল ব্যবহার করুন আপনার কাজটি করার জন্য।
ভিক্টর পুদেয়েভ

90
হ্যাঁ, আপনার নিজের কোড লেখা ভয়ানক, কারণ তুলনামূলক তুচ্ছ কাজগুলির জন্য কয়েক ডজন তৃতীয় পক্ষের মডিউল ব্যবহার করা বড় মাপের অ্যাপ্লিকেশনগুলিতে কোনও ত্রুটি থাকতে পারে তা প্রমাণিত হয়নি।
এরিক

8

আপনি যদি নোড 8+ ব্যবহার করেন তবে অ্যাসিঙ্ক্রোনসিটি চান এবং বাহ্যিক নির্ভরতা না চান, এখানে অ্যাসিঙ্ক / অপেক্ষার সংস্করণটি রয়েছে:

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

const readdir = util.promisify(fs.readdir);
const lstat = util.promisify(fs.lstat);
const unlink = util.promisify(fs.unlink);
const rmdir = util.promisify(fs.rmdir);

const removeDir = async (dir) => {
    try {
        const files = await readdir(dir);
        await Promise.all(files.map(async (file) => {
            try {
                const p = path.join(dir, file);
                const stat = await lstat(p);
                if (stat.isDirectory()) {
                    await removeDir(p);
                } else {
                    await unlink(p);
                    console.log(`Removed file ${p}`);
                }
            } catch (err) {
                console.error(err);
            }
        }))
        await rmdir(dir);
        console.log(`Removed dir ${dir}`);
    } catch (err) {
      console.error(err);
    }
}

4

Fs.promises ব্যবহার করে @ শার্পকোডার এর উত্তরের অ্যাসিঙ্ক সংস্করণ :

const fs = require('fs');
const afs = fs.promises;

const deleteFolderRecursive = async path =>  {
    if (fs.existsSync(path)) {
        for (let entry of await afs.readdir(path)) {
            const curPath = path + "/" + entry;
            if ((await afs.lstat(curPath)).isDirectory())
                await deleteFolderRecursive(curPath);
            else await afs.unlink(curPath);
        }
        await afs.rmdir(path);
    }
};

3

আমি এখানে পৌঁছানোর চেষ্টা করার সময় এখানে পৌঁছেছি gulpএবং আমি আরও পৌঁছানোর জন্য লিখছি।

আপনি যখন ফাইল এবং ফোল্ডারগুলি ব্যবহার করে মুছতে চান del, আপনার /**পুনরাবৃত্ত মোছার জন্য যুক্ত করা উচিত ।

gulp.task('clean', function () {
    return del(['some/path/to/delete/**']);
});

2

ডি ফ্যাক্টো প্যাকেজটি rimrafতবে এখানে আমার ক্ষুদ্র অ্যাসিঙ্ক সংস্করণটি রয়েছে:

const fs = require('fs')
const path = require('path')
const Q = require('q')

function rmdir (dir) {
  return Q.nfcall(fs.access, dir, fs.constants.W_OK)
    .then(() => {
      return Q.nfcall(fs.readdir, dir)
        .then(files => files.reduce((pre, f) => pre.then(() => {
          var sub = path.join(dir, f)
          return Q.nfcall(fs.lstat, sub).then(stat => {
            if (stat.isDirectory()) return rmdir(sub)
            return Q.nfcall(fs.unlink, sub)
          })
        }), Q()))
    })
    .then(() => Q.nfcall(fs.rmdir, dir))
}

2

Node.js এর সর্বশেষ সংস্করণ (12.10.0 বা পরবর্তী) সালে rmdirশৈলী ফাংশন fs.rmdir(), fs.rmdirSync()এবং fs.promises.rmdir()একটি নতুন পরীক্ষামূলক বিকল্প আছে recursiveখালি নয় এমন ডিরেক্টরি মুছে ফেলার অনুমতি দেয়, যেমন

fs.rmdir(path, { recursive: true });

গিটহাব সম্পর্কিত সম্পর্কিত PR: https://github.com/nodejs/node/pull/29168


2

fsডকুমেন্টেশন অনুসারে , fsPromisesবর্তমানে recursiveএকটি পরীক্ষামূলক ভিত্তিতে বিকল্প সরবরাহ করা হয়, যা উইন্ডোজে অন্তত আমার নিজের ক্ষেত্রে ডিরেক্টরি এবং এতে কোনও ফাইল সরিয়ে দেয়।

fsPromises.rmdir(path, {
  recursive: true
})

না recursive: trueLinux এবং MacOS এর ফাইল সরাবেন?


1

আল্ট্রা গতি এবং ব্যর্থ-প্রমাণ

আপনি lignatorপ্যাকেজটি ব্যবহার করতে পারেন ( https://www.npmjs.com/package/lignator ), এটি কোনও অ্যাসিঙ্ক কোড (যেমন রিম্রাফ) এর চেয়ে দ্রুত এবং আরও ব্যর্থ-প্রমাণ (বিশেষত উইন্ডোজে, যেখানে ফাইল অপসারণ তাত্ক্ষণিক নয় এবং ফাইলগুলি সম্ভবত অন্যান্য প্রক্রিয়া দ্বারা লক করা)।

উইন্ডোতে 4,36 জিবি ডেটা, 28 042 ফাইল, 4 217 ফোল্ডারগুলি 15 সেকেন্ডের মধ্যে রিমরাফের 60 সেকেন্ডে পুরানো এইচডিডি তে সরিয়ে ফেলা হয়েছে ।

const lignator = require('lignator');

lignator.remove('./build/');

1

সিঙ্ক ফোল্ডার ফাইল বা শুধুমাত্র একটি ফাইল দিয়ে মুছে ফেলুন।

আমি দাতা বা অবদানকারীদের পক্ষে খুব বেশি নই তবে আমি এই সমস্যার একটি ভাল সমাধান খুঁজে পেলাম না এবং আমাকে আমার পথটি সন্ধান করতে হবে ... তাই আমি আশা করি আপনি এটি পছন্দ করবেন :) যে

কোনও সংখ্যক নিয়ে আমার জন্য নিখুঁত কাজ করে নেস্টেড ডিরেক্টরি এবং সাব ডিরেক্টরি। ফাংশন পুনরাবৃত্তি যখন 'এটি' এর সুযোগ জন্য সতর্কতা, আপনার বাস্তবায়ন ভিন্ন হতে পারে। আমার ক্ষেত্রে এই ফাংশনটি অন্য ফাংশনটির ফিরতিতে স্থির থাকে সে কারণেই আমি এটির সাথে এটি কল করছি।

    const fs = require('fs');

    deleteFileOrDir(path, pathTemp = false){
            if (fs.existsSync(path)) {
                if (fs.lstatSync(path).isDirectory()) {
                    var files = fs.readdirSync(path);
                    if (!files.length) return fs.rmdirSync(path);
                    for (var file in files) {
                        var currentPath = path + "/" + files[file];
                        if (!fs.existsSync(currentPath)) continue;
                        if (fs.lstatSync(currentPath).isFile()) {
                            fs.unlinkSync(currentPath);
                            continue;
                        }
                        if (fs.lstatSync(currentPath).isDirectory() && !fs.readdirSync(currentPath).length) {
                            fs.rmdirSync(currentPath);
                        } else {
                            this.deleteFileOrDir(currentPath, path);
                        }
                    }
                    this.deleteFileOrDir(path);
                } else {
                    fs.unlinkSync(path);
                }
            }
            if (pathTemp) this.deleteFileOrDir(pathTemp);
        }

1

যদিও recursiveএর একটি পরীক্ষামূলক বিকল্প রয়েছেfs.rmdir

function rm (path, cb) {
    fs.stat(path, function (err, stats) {
        if (err)
            return cb(err);

        if (stats.isFile())
            return fs.unlink(path, cb);

        fs.rmdir(path, function (err) {
            if (!err || err && err.code != 'ENOTEMPTY') 
                return cb(err);

            fs.readdir(path, function (err, files) {
                if (err)
                    return cb(err);

                let next = i => i == files.length ? 
                    rm(path, cb) : 
                    rm(path + '/' + files[i], err => err ? cb(err) : next(i + 1));

                next(0);
            });
        });
    });
}

1

2020 আপডেট

সংস্করণ থেকে 12.10.0 পুনরাবৃত্তির বিকল্প বিকল্পের জন্য যুক্ত করা হয়েছে।

দ্রষ্টব্য যে পুনরাবৃত্তি মোছা পরীক্ষামূলক

সুতরাং আপনি সিঙ্কের জন্য করবেন:

fs.rmdirSync(dir, {recursive: true});

বা অ্যাসিঙ্কের জন্য:

fs.rmdir(dir, {recursive: true});

0

শুধু rmdir মডিউল ব্যবহার ! এটি সহজ এবং সহজ


6
কোডের প্রতিটি ছোট অংশের জন্য একটি মডিউল ব্যবহার করা সর্বদা ভাল ধারণা নয়। উদাহরণস্বরূপ যদি আপনাকে লাইসেন্স চুক্তি তৈরি করতে হয় তবে এটি আসল ব্যথা তৈরি করে।
মিজাগো

4
আপনার উত্তরটি আরও আকর্ষণীয় হওয়ার জন্য আপনাকে একটি কোডের নমুনা যুক্ত করতে হবে
জেল্টোর

0

আরেকটি বিকল্প হ'ল fs-promiseমডিউলটি ব্যবহার করছে যা fs-extraমডিউলগুলির প্রতিশ্রুতিবদ্ধ সংস্করণ সরবরাহ করে

আপনি তাহলে এই উদাহরণের মতো লিখতে পারেন:

const { remove, mkdirp, writeFile, readFile } = require('fs-promise')
const { join, dirname } = require('path')

async function createAndRemove() {
  const content = 'Hello World!'
  const root = join(__dirname, 'foo')
  const file = join(root, 'bar', 'baz', 'hello.txt')

  await mkdirp(dirname(file))
  await writeFile(file, content)
  console.log(await readFile(file, 'utf-8'))
  await remove(join(__dirname, 'foo'))
}

createAndRemove().catch(console.error)

দ্রষ্টব্য: async / প্রতীক্ষার জন্য সাম্প্রতিক নোডেজ সংস্করণ (7.6+) প্রয়োজন


0

একটি দ্রুত এবং নোংরা উপায় (সম্ভবত পরীক্ষার জন্য) হ'ল ডিরেক্টরিটি সরিয়ে ফেলতে ওএস কল আহ্বান করার জন্য সরাসরি পদ্ধতি execবা spawnপদ্ধতিটি ব্যবহার করা যেতে পারে । নোডজেস চাইল্ড_প্রসেসে আরও পড়ুন ।

let exec = require('child_process').exec
exec('rm -Rf /tmp/*.zip', callback)

ডাউনসাইডগুলি হ'ল:

  1. আপনি অন্তর্নিহিত ওএসের উপর নির্ভর করে অর্থাৎ একই পদ্ধতিটি ইউনিক্স / লিনাক্সে চলবে তবে সম্ভবত উইন্ডোতে নয়।
  2. শর্ত বা ত্রুটির কারণে আপনি প্রক্রিয়াটিকে হাইজ্যাক করতে পারবেন না। আপনি কেবল অন্তর্নিহিত ওএসকে টাস্ক দিন এবং প্রস্থান কোডটি ফিরে আসার জন্য অপেক্ষা করুন।

উপকারিতা:

  1. এই প্রক্রিয়াগুলি অবিচ্ছিন্নভাবে চলতে পারে।
  2. আপনি কমান্ডের আউটপুট / ত্রুটির জন্য শুনতে পারেন, সুতরাং কমান্ড আউটপুট হারাবে না। যদি অপারেশন সম্পন্ন না হয়, আপনি ত্রুটি কোডটি পরীক্ষা করে আবার চেষ্টা করতে পারেন।

2
আপনি যখন স্ক্রিপ্ট লিখবেন এবং নির্ভরতা ইনস্টল করতে চান না তার জন্য উপযুক্ত কারণ আপনি আপনার সমস্ত ফাইল মুছে ফেলার পরে 30 সেকেন্ডের মধ্যে আপনি এই স্ক্রিপ্টটি মুছে ফেলতে চলেছেন !!
ম্যাথিয়াস

মূল ফাইল সিস্টেমটি বিশৃঙ্খলাবদ্ধ এবং মুছে ফেলার উপায় রয়েছে। এক্ষেত্রে ওপি -fপতাকাটি নিরাপদে থাকার জন্য সরিয়ে ফেলতে পারে, বা টাইপ করার সময় নিশ্চিত করে ফেলতে পারে যে সে সব কিছু মুছে ফেলছে না। exec + rmনোডে একটি বৈধ এবং দরকারী কমান্ড যা আমি পরীক্ষার সময় প্রায়শই ব্যবহার করি।
র‌্যাশ

0

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

আপডেট: এখন উইন্ডোজে কাজ করা উচিত (পরীক্ষিত উইন্ডোজ 10), এবং লিনাক্স / ইউনিক্স / বিএসডি / ম্যাক সিস্টেমগুলিতেও কাজ করা উচিত।

const
    execSync = require("child_process").execSync,
    fs = require("fs"),
    os = require("os");

let removeDirCmd, theDir;

removeDirCmd = os.platform() === 'win32' ? "rmdir /s /q " : "rm -rf ";

theDir = __dirname + "/../web-ui/css/";

// WARNING: Do not specify a single file as the windows rmdir command will error.
if (fs.existsSync(theDir)) {
    console.log(' removing the ' + theDir + ' directory.');
    execSync(removeDirCmd + '"' + theDir + '"', function (err) {
        console.log(err);
    });
}

আপনি যদি একটি একক মডিউল চান তবে সম্ভবত এফএস-এক্সট্রা এর উপায়।
b01

3
এই পদ্ধতিটি সম্পূর্ণ বিপজ্জনক dangerous শেল কমান্ডের স্ট্রিং কনটেনটেশন, বিশেষত অব্যাহতি ছাড়াই কোড প্রয়োগের দুর্বলতা এবং অনুরূপটিকে আমন্ত্রণ জানায়। আপনি যদি rmdir ব্যবহার করতে চলেছেন child_process.execFileতবে শেলটি চাওয়া হবে না এমন ব্যবহার করুন এবং পরিবর্তে যুক্তিগুলি সুস্পষ্টভাবে পাস করুন।
nevyn

@ নিউভিন আমি চেষ্টা করে দেখব এবং আমার উত্তর যদি তা কার্যকর হয় তবে আপডেট করব।
বি01

সর্বদা তৃতীয় পক্ষ ব্যবহার না করা পছন্দ! ধন্যবাদ!
আন্তন মিটসেভ

তা ছাড়াও, এই পদ্ধতিটি বেশ ধীর। নোডেজ নেটিভ এপি অনেক দ্রুত।
মের্সি

0

প্রতিশ্রুতি সমাধানের জন্য এটি প্রতিশ্রুতিবদ্ধ এবং দুটি সহায়তা ফাংশন (সমস্ত এবং টু) ব্যবহার করে একটি পদ্ধতি।

এটি সমস্ত ক্রিয়াকলাপকে অ্যাসিঙ্ক্রোনাস করে।

const fs = require('fs');
const { promisify } = require('util');
const to = require('./to');
const toAll = require('./toAll');

const readDirAsync = promisify(fs.readdir);
const rmDirAsync = promisify(fs.rmdir);
const unlinkAsync = promisify(fs.unlink);

/**
    * @author Aécio Levy
    * @function removeDirWithFiles
    * @usage: remove dir with files
    * @param {String} path
    */
const removeDirWithFiles = async path => {
    try {
        const file = readDirAsync(path);
        const [error, files] = await to(file);
        if (error) {
            throw new Error(error)
        }
        const arrayUnlink = files.map((fileName) => {
            return unlinkAsync(`${path}/${fileName}`);
        });
        const [errorUnlink, filesUnlink] = await toAll(arrayUnlink);
        if (errorUnlink) {
            throw new Error(errorUnlink);
        }
        const deleteDir = rmDirAsync(path);
        const [errorDelete, result] = await to(deleteDir);
        if (errorDelete) {
            throw new Error(errorDelete);
        }
    } catch (err) {
        console.log(err)
    }
}; 

0

// কোনও তৃতীয় পক্ষের lib ব্যবহার ছাড়াই

const fs = require('fs');
var FOLDER_PATH = "./dirname";
var files = fs.readdirSync(FOLDER_PATH);
files.forEach(element => {
    fs.unlinkSync(FOLDER_PATH + "/" + element);
});
fs.rmdirSync(FOLDER_PATH);

1
এটি আমার প্রয়োজনের জন্য কাজ করবে তবে আপনি স্ল্যাশকে fs.unllinkSync(path.join(FOLDER_PATH, element);
বোঝানোর

-1
const fs = require("fs")
const path = require("path")

let _dirloc = '<path_do_the_directory>'

if (fs.existsSync(_dirloc)) {
  fs.readdir(path, (err, files) => {
    if (!err) {
      for (let file of files) {
        // Delete each file
        fs.unlinkSync(path.join(_dirloc, file))
      }
    }
  })
  // After the 'done' of each file delete,
  // Delete the directory itself.
  if (fs.unlinkSync(_dirloc)) {
    console.log('Directory has been deleted!')
  }
}

1
আমি মনে করি নেস্টেড ডিরেক্টরিগুলির জন্য এই জাতীয় কিছু কাজ করা উচিত।
বুদ্ধিহীন

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