ডিরেক্টরি নোডেজের মধ্যে সমস্ত ডিরেক্টরি পান


260

আমি আশা করছিলাম এটি একটি সাধারণ জিনিস হবে তবে আমি এটি করার জন্য সেখানে কিছুই খুঁজে পাচ্ছি না।

আমি কেবল একটি নির্দিষ্ট ফোল্ডার / ডিরেক্টরিতে সমস্ত ফোল্ডার / ডিরেক্টরি পেতে চাই।

উদাহরণস্বরূপ:

<MyFolder>
|- SomeFolder
|- SomeOtherFolder
|- SomeFile.txt
|- SomeOtherFile.txt
|- x-directory

আমি একটি অ্যারে পেতে আশা করব:

["SomeFolder", "SomeOtherFolder", "x-directory"]

বা উপরের পথটি যদি এমনভাবেই করা হত ...

সুতরাং উপরোক্ত কিছু করতে ইতিমধ্যে কি কিছু বিদ্যমান?

উত্তর:


463

এখানে এই উত্তরের একটি সংক্ষিপ্ত, সিঙ্ক্রোনাস সংস্করণ যা বর্তমান ডিরেক্টরিতে সমস্ত ডিরেক্টরি (লুকানো বা না) তালিকাভুক্ত করতে পারে:

const { lstatSync, readdirSync } = require('fs')
const { join } = require('path')

const isDirectory = source => lstatSync(source).isDirectory()
const getDirectories = source =>
  readdirSync(source).map(name => join(source, name)).filter(isDirectory)

নোড 10.10.0++ এর জন্য আপডেট

অতিরিক্ত কলটি এড়াতে আমরা নতুন withFileTypesবিকল্পটি ব্যবহার করতে পারি :readdirSynclstatSync

const { readdirSync } = require('fs')

const getDirectories = source =>
  readdirSync(source, { withFileTypes: true })
    .filter(dirent => dirent.isDirectory())
    .map(dirent => dirent.name)

14
সাবধান, ফাইল স্ট্যাটাস পেতে আপনার বিস্মৃত পথ প্রয়োজন। require('path').resolve(__dirname, file)
সিলম

9
@ পিলাউ এটি কেবল কোনও আপেক্ষিক পথ নিয়ে কাজ করে না, আপনাকে কেন এটি স্বাভাবিক করার দরকার তা ঠিক। তার জন্য আপনি path.resolve ব্যবহার করতে পারেন।
সিলম

1
@ ক্রিসুলিভিয়ান: আপনার প্রতিক্রিয়াটি পুনরাবৃত্তি করতে হবে এবং প্রতিটি ফোল্ডারের অভ্যন্তরে
পথের

5
যেহেতু আপনি es6 ব্যবহার করছেন:const getDirectories = srcPath => fs.readdirSync(srcPath).filter(file => fs.statSync(path.join(srcPath, file)).isDirectory())
পিটারোটুল

2
ডিরেক্টরিতে প্রতিলিঙ্কগুলি থাকলে এই বিরতিগুলি নোট করুন। lstatSyncপরিবর্তে ব্যবহার করুন।
ডেভ

103

জাভাস্ক্রিপ্ট ES6 (ES2015) এর সিনট্যাক্সটিকে এটির একটি লাইনারের বৈশিষ্ট্য ধন্যবাদ

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

const { readdirSync, statSync } = require('fs')
const { join } = require('path')

const dirs = p => readdirSync(p).filter(f => statSync(join(p, f)).isDirectory())

নোড.জেএস 10+ (পরীক্ষামূলক) এর জন্য অ্যাসিঙ্ক্রোনাস সংস্করণ

const { readdir, stat } = require("fs").promises
const { join } = require("path")

const dirs = async path => {
  let dirs = []
  for (const file of await readdir(path)) {
    if ((await stat(join(path, file))).isDirectory()) {
      dirs = [...dirs, file]
    }
  }
  return dirs
}

30
একটি লাইনে কিছু জোর করা এটিকে কম পঠনযোগ্য এবং তাই কম কাঙ্ক্ষিত করে তোলে।
rlemon

7
আপনি যে কোনও নির্দেশকে এক লাইনে ফিট করতে পারেন, তার অর্থ এই নয় যে আপনার উচিত।
কেভিন বি

4
সম্মত। লোকেরা কেন এটিকে কম করেছে তা নিশ্চিত নয়। একটি লাইনার খারাপ তবে কমোন, আপনি এটি আপনার ইচ্ছামতো সুন্দর করতে পারেন।
আমির আফ্রিদি

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

23
আপনি কি গুরুতর? এটি একটি পুরোপুরি সূক্ষ্ম এবং বৈধ উত্তর! একটি লাইন, চৌর্যবৃত্তির - ইচ্ছা লসী অজুহাত উপার্জন একটি উপায় ছিল। এটি রকেট বিজ্ঞান নয়। এটি একটি খুব সাধারণ এবং বোবা অপারেশন! এটির জন্য ভার্বোজ হবেন না! নিশ্চিতভাবে আমার +1 পান!
মিচিফ

36

একটি পাথ ব্যবহার করে ডিরেক্টরিগুলি তালিকাভুক্ত করুন।

function getDirectories(path) {
  return fs.readdirSync(path).filter(function (file) {
    return fs.statSync(path+'/'+file).isDirectory();
  });
}

1
এটি একদম
সোজাসাপ্টা

অবশেষে একটি আমি বুঝতে পারি
ফোরসিচামনি ০

21

পুনরাবৃত্তির সমাধান

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

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

function flatten(lists) {
  return lists.reduce((a, b) => a.concat(b), []);
}

function getDirectories(srcpath) {
  return fs.readdirSync(srcpath)
    .map(file => path.join(srcpath, file))
    .filter(path => fs.statSync(path).isDirectory());
}

function getDirectoriesRecursive(srcpath) {
  return [srcpath, ...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))];
}

এটি হ'ল আমি যা খুঁজছিলাম এবং এটি দুর্দান্ত কাজ করছে বলে মনে হচ্ছে ব্যতীত প্রথমটি ব্যতীত প্রতিটি পথই এর মতো প্রদর্শিত হবে: "src / পৃষ্ঠাগুলি / পার্টিয়াল / বোতাম" এর পরিবর্তে "src \\ পৃষ্ঠাগুলি ti পার্টিয়াল \\ বোতাম" । আমি এই নোংরা ফিক্সটি যুক্ত করেছি: var res = getDirectoriesRecursive (srcpath); res = res.map (ফাংশন (এক্স) {রিটার্ন x.replace (/ \\ / g, "/")}); console.log (মাঝামাঝি);
পলব

1
এটি করার একটি কম নোংরা উপায় হ'ল পথ.অনর্মালাইজ ()। nodejs.org/api/path.html#path_path_normalize_path
প্যাট্রিক ম্যাকএলহানি

আপনি প্যারেন্ট ডিরেক্টরিটি ফিরিয়ে দিচ্ছেন, যা কাম্য নয়। আমি getDirectoriesRecursive refactor প্রতিরোধ যে হবে: if (recursive) return [srcpath, ...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; else return [...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; }
Nadav

10

এটি করা উচিত:

কফিস্ক্রিপ্ট (সিঙ্ক)

fs = require 'fs'

getDirs = (rootDir) ->
    files = fs.readdirSync(rootDir)
    dirs = []

    for file in files
        if file[0] != '.'
            filePath = "#{rootDir}/#{file}"
            stat = fs.statSync(filePath)

            if stat.isDirectory()
                dirs.push(file)

    return dirs

কফিস্ক্রিপ্ট (async)

fs = require 'fs'

getDirs = (rootDir, cb) ->
    fs.readdir rootDir, (err, files) ->
        dirs = []

        for file, index in files
            if file[0] != '.'
                filePath = "#{rootDir}/#{file}"
                fs.stat filePath, (err, stat) ->
                    if stat.isDirectory()
                        dirs.push(file)
                    if files.length == (index + 1)
                        cb(dirs)

জাভাস্ক্রিপ্ট (async)

var fs = require('fs');
var getDirs = function(rootDir, cb) { 
    fs.readdir(rootDir, function(err, files) { 
        var dirs = []; 
        for (var index = 0; index < files.length; ++index) { 
            var file = files[index]; 
            if (file[0] !== '.') { 
                var filePath = rootDir + '/' + file; 
                fs.stat(filePath, function(err, stat) {
                    if (stat.isDirectory()) { 
                        dirs.push(this.file); 
                    } 
                    if (files.length === (this.index + 1)) { 
                        return cb(dirs); 
                    } 
                }.bind({index: index, file: file})); 
            }
        }
    });
}

1
যদিও এটি যদি কোনও উত্পাদন ব্যবস্থার জন্য হয় তবে আপনি সত্যিই সিঙ্ক্রোনাস fsপদ্ধতিগুলি এড়াতে চান ।
অ্যারন ডুফর

20
এই উত্তরটি পড়তে থাকা কোনও নবজাতকের জন্য নোট করুন: এটি কফিস্ক্রিপ্ট, জাভাস্ক্রিপ্ট নয় (আমার বন্ধু আমাকে বিভ্রান্তিতে মেসেজ করেছিল যে কেন জাভাস্ক্রিপ্টে হঠাৎ শব্দার্থক সাদা স্থান রয়েছে) জিজ্ঞাসা করে।
ডালনএফ

1
@nicksweet আপনি কি এটি জেএস এ রূপান্তর করতে পারবেন?
মাইকমেকানা

1
এই উত্তরটির সাথে কিছু সুস্পষ্ট সমস্যা রয়েছে: এটি পরিচালনা করতে কোনও ত্রুটি নেই; (কলব্যাক স্বাক্ষর হওয়া উচিত (err, dirs)); এটি ডট ফাইল বা ফোল্ডারগুলির উপস্থিতিতে ফিরে আসবে না; এটি সমস্ত দৌড়ের অবস্থার জন্য সংবেদনশীল; এটি সমস্ত এন্ট্রি চেক করার আগে এটি আবার কল করতে পারে।
1j01

21
হ্যাঁ, লোকেরা সিঙ্ক এপিআইকে অসম্পূর্ণ করা বন্ধ করতে হবে। সিঙ্ক সংস্করণ ব্যবহার করা উচিত কিনা তা নির্ধারণ করা এটি "উত্পাদন" হওয়ার কারণে নির্ধারিত হয় না। অ্যাড এনসোমিকেও পুনরাবৃত্তি করা যে async এপিআই আরও ভাল এবং সিঙ্কটি খারাপ, প্রসঙ্গ ছাড়াই, ঠিক সঠিক নয়। আমি আশা করি জেএস সম্প্রদায় এটি প্রচার বন্ধ করে দেবে। সিঙ্কটি সহজ (ইয়ে) তবে বার্তা লুপ (বু) ব্লক করবে। সুতরাং, এমন কোনও সার্ভারে সিঙ্ক এপিআই ব্যবহার করবেন না যেখানে আপনি অবরুদ্ধ করতে চান না তবে সেগুলি বিল্ড স্ক্রিপ্টে নির্দ্বিধায় ব্যবহার করুন যেখানে এটির কোনও গুরুত্ব নেই that </
ran

6

বিকল্পভাবে, আপনি যদি বাহ্যিক গ্রন্থাগারগুলি ব্যবহার করতে সক্ষম হন তবে আপনি ব্যবহার করতে পারেন filehound। এটি কলব্যাক, প্রতিশ্রুতি এবং সিঙ্ক কলগুলি সমর্থন করে।

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

const Filehound = require('filehound');

Filehound.create()
  .path("MyFolder")
  .directory() // only search for directories
  .find()
  .then((subdirectories) => {
    console.log(subdirectories);
  });

কলব্যাক ব্যবহার:

const Filehound = require('filehound');

Filehound.create()
  .path("MyFolder")
  .directory()
  .find((err, subdirectories) => {
    if (err) return console.error(err);

    console.log(subdirectories);
  });

সিঙ্ক কল:

const Filehound = require('filehound');

const subdirectories = Filehound.create()
  .path("MyFolder")
  .directory()
  .findSync();

console.log(subdirectories);

আরও তথ্যের জন্য (এবং উদাহরণগুলি), ডক্সগুলি দেখুন: https://github.com/nspragg/filehound

দাবি অস্বীকার: আমি লেখক।


5

নোড.জেএস সংস্করণ> = v10.13.0 এর সাথে, fs.readdirSync fs.Dirent অবজেক্টগুলির একটি অ্যারে প্রদান করবে যদি withFileTypesবিকল্পটি সেট করা থাকে true

সুতরাং আপনি ব্যবহার করতে পারেন,

const fs = require('fs')

const directories = source => fs.readdirSync(source, {
   withFileTypes: true
}).reduce((a, c) => {
   c.isDirectory() && a.push(c.name)
   return a
}, [])

ভাল পয়েন্ট, তবে .filter(c => c.isDirectory())ব্যবহারের চেয়ে সহজ হবেreduce()
এমমানুয়েল টাজারি

হ্যাঁ, তবে ফিল্টার fs.Dirent অবজেক্টগুলির একটি অ্যারে দেয় যা ডিরেক্টরি are ওপি ডিরেক্টরিগুলির নাম চেয়েছিল।
ময়ূর

1
সত্য, আমি এখনও কলটির .filter(c => c.isDirectory()).map(c => c.name)চেয়ে বেশি পছন্দ করব reduce
ইমমানুয়েল টাজারি

আমি আপনার পয়েন্ট দেখুন. আমার ধারণা, তাই পাঠকরা তাদের ব্যবহারের ক্ষেত্রে ভিত্তিতে সিদ্ধান্ত নিতে পারেন। আমি বলতে চাই যে ইন-মেমোরি অ্যারের উপরে লুপিং করা ডিস্ক থেকে পড়ার I / O এর তুলনায় ওভারহেডে নগণ্য হওয়া উচিত, এমনকি আপনি এসএসডি থেকে পড়ছেন, তবে যথারীতি যদি কেউ যত্ন করে তবে তারা পরিমাপ করতে পারে।
ইমানুয়েল টাজরি

5
 var getDirectories = (rootdir , cb) => {
    fs.readdir(rootdir, (err, files) => {
        if(err) throw err ;
        var dirs = files.map(filename => path.join(rootdir,filename)).filter( pathname => fs.statSync(pathname).isDirectory());
        return cb(dirs);
    })

 }
 getDirectories( myDirectories => console.log(myDirectories));``

4

এফএস-এক্সট্রা ব্যবহার করে, যা অ্যাসিঙ্ক এফএস কলগুলি এবং নতুন অপেক্ষায় অ্যাসিঙ্ক সিনট্যাক্সের প্রতিশ্রুতি দেয়:

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

async function getDirectories(path){
    let filesAndDirectories = await fs.readdir(path);

    let directories = [];
    await Promise.all(
        filesAndDirectories.map(name =>{
            return fs.stat(path + name)
            .then(stat =>{
                if(stat.isDirectory()) directories.push(name)
            })
        })
    );
    return directories;
}

let directories = await getDirectories("/")

3

এবং getD निर्देशिकाগুলির একটি অ্যাসিঙ্ক সংস্করণ, আপনার এর জন্য অ্যাসিঙ্ক মডিউলটি প্রয়োজন :

var fs = require('fs');
var path = require('path');
var async = require('async'); // https://github.com/caolan/async

// Original function
function getDirsSync(srcpath) {
  return fs.readdirSync(srcpath).filter(function(file) {
    return fs.statSync(path.join(srcpath, file)).isDirectory();
  });
}

function getDirs(srcpath, cb) {
  fs.readdir(srcpath, function (err, files) {
    if(err) { 
      console.error(err);
      return cb([]);
    }
    var iterator = function (file, cb)  {
      fs.stat(path.join(srcpath, file), function (err, stats) {
        if(err) { 
          console.error(err);
          return cb(false);
        }
        cb(stats.isDirectory());
      })
    }
    async.filter(files, iterator, cb);
  });
}

2

এই উত্তর readdirSyncবা এর মতো ব্লকিং ফাংশন ব্যবহার করে না statSync। এটি বাহ্যিক নির্ভরতা ব্যবহার করে না বা কলব্যাক নরকের গভীরতায় নিজেকে খুঁজে পায় না।

পরিবর্তে আমরা আধুনিক জাভাস্ক্রিপ্ট সুবিধাদি যেমন প্রতিশ্রুতি এবং async-awaitসিনট্যাক্স ব্যবহার করি। এবং অ্যাসিনক্রোনাস ফলাফল সমান্তরালে প্রক্রিয়াজাত করা হয়; ক্রমানুসারে নয় -

const { readdir, stat } =
  require ("fs") .promises

const { join } =
  require ("path")

const dirs = async (path = ".") =>
  (await stat (path)) .isDirectory ()
    ? Promise
        .all
          ( (await readdir (path))
              .map (p => dirs (join (path, p)))
          )
        .then
          ( results =>
              [] .concat (path, ...results)
          )
    : []

আমি একটি উদাহরণ প্যাকেজ ইনস্টল করব এবং তারপরে আমাদের ফাংশনটি পরীক্ষা করব -

$ npm install ramda
$ node

চলুন দেখে নেওয়া যাক -

> dirs (".") .then (console.log, console.error)

[ '.'
, 'node_modules'
, 'node_modules/ramda'
, 'node_modules/ramda/dist'
, 'node_modules/ramda/es'
, 'node_modules/ramda/es/internal'
, 'node_modules/ramda/src'
, 'node_modules/ramda/src/internal'
]

একটি সাধারণীকরণ করা মডিউল ব্যবহার করে Parallel, আমরা এর সংজ্ঞাটি সহজ করতে পারি dirs-

const Parallel =
  require ("./Parallel")

const dirs = async (path = ".") =>
  (await stat (path)) .isDirectory ()
    ? Parallel (readdir (path))
        .flatMap (f => dirs (join (path, f)))
        .then (results => [ path, ...results ])
    : []

Parallelউপরে ব্যবহৃত মডিউল একটি প্যাটার্ন যে একটি অনুরূপ সমস্যা সমাধানের জন্য ডিজাইন করা ফাংশন একটি সেট থেকে নিষ্কাশিত হয়। আরও ব্যাখ্যার জন্য, এই সম্পর্কিত প্রশ্নোত্তর দেখুন ।


1

সঠিক ত্রুটি পরিচালনার সাথে এই উত্তরটির কফিস্ক্রিপ্ট সংস্করণ :

fs = require "fs"
{join} = require "path"
async = require "async"

get_subdirs = (root, callback)->
    fs.readdir root, (err, files)->
        return callback err if err
        subdirs = []
        async.each files,
            (file, callback)->
                fs.stat join(root, file), (err, stats)->
                    return callback err if err
                    subdirs.push file if stats.isDirectory()
                    callback null
            (err)->
                return callback err if err
                callback null, subdirs

উপর নির্ভর করে ASYNC

বিকল্পভাবে, এর জন্য একটি মডিউল ব্যবহার করুন! (সমস্ত কিছুর জন্য মডিউল রয়েছে [[উদ্ধৃতি আবশ্যক])


1

আপনার যদি সমস্ত asyncসংস্করণ ব্যবহার করার প্রয়োজন হয় । আপনার এই জাতীয় কিছু থাকতে পারে।

  1. ডিরেক্টরি দৈর্ঘ্য রেকর্ড করুন, সমস্ত অ্যাসিঙ্ক স্ট্যাট কাজ শেষ হয়েছে কিনা তা জানানোর জন্য এটি সূচক হিসাবে ব্যবহার করে।

  2. যদি অ্যাসিঙ্ক স্ট্যাট কাজগুলি সমাপ্ত হয়, সমস্ত ফাইল স্ট্যাট চেক করা হয়েছে, তাই কলব্যাক কল করুন

এটি কেবল ততক্ষণ কাজ করবে যতক্ষণ নোড.জেএস একক থ্রেড, কারণ এটি ধরে নেওয়া হয় যে কোনও দুটি অ্যাসিঙ্ক কার্য একই সময়ে কাউন্টারকে বাড়িয়ে তুলবে না।

'use strict';

var fs = require("fs");
var path = require("path");
var basePath = "./";

function result_callback(results) {
    results.forEach((obj) => {
        console.log("isFile: " + obj.fileName);
        console.log("fileName: " + obj.isFile);
    });
};

fs.readdir(basePath, (err, files) => {
    var results = [];
    var total = files.length;
    var finished = 0;

    files.forEach((fileName) => {
        // console.log(fileName);
        var fullPath = path.join(basePath, fileName);

        fs.stat(fullPath, (err, stat) => {
            // this will work because Node.js is single thread
            // therefore, the counter will not increment at the same time by two callback
            finished++;

            if (stat.isFile()) {
                results.push({
                    fileName: fileName,
                    isFile: stat.isFile()
                });
            }

            if (finished == total) {
                result_callback(results);
            }
        });
    });
});

আপনি দেখতে পাচ্ছেন, এটি একটি "গভীরতা প্রথম" পদ্ধতির, এবং এর ফলে কলব্যাক জাহান্নাম হতে পারে, এবং এটি বেশ "কার্যকরী" নয়। লোকেরা আশ্বাসের কাজটি একটি প্রতিশ্রুতি বস্তুতে মোড়ক করে প্রতিশ্রুতি দিয়ে এই সমস্যাটি সমাধান করার চেষ্টা করে।

'use strict';

var fs = require("fs");
var path = require("path");
var basePath = "./";

function result_callback(results) {
    results.forEach((obj) => {
        console.log("isFile: " + obj.fileName);
        console.log("fileName: " + obj.isFile);
    });
};

fs.readdir(basePath, (err, files) => {
    var results = [];
    var total = files.length;
    var finished = 0;

    var promises = files.map((fileName) => {
        // console.log(fileName);
        var fullPath = path.join(basePath, fileName);

        return new Promise((resolve, reject) => {
            // try to replace fullPath wil "aaa", it will reject
            fs.stat(fullPath, (err, stat) => {
                if (err) {
                    reject(err);
                    return;
                }

                var obj = {
                    fileName: fileName,
                    isFile: stat.isFile()
                };

                resolve(obj);
            });
        });
    });

    Promise.all(promises).then((values) => {
        console.log("All the promise resolved");
        console.log(values);
        console.log("Filter out folder: ");
        values
            .filter((obj) => obj.isFile)
            .forEach((obj) => {
                console.log(obj.fileName);
            });
    }, (reason) => {
        console.log("Not all the promise resolved");
        console.log(reason);
    });
});

গুড কোড! তবে আমি মনে করি এটি প্রতিশ্রুতি.সব ব্লকে "ফিল্টার আউট ফাইলগুলি" হওয়া উচিত কারণ এটি কোনও ফাইল কিনা এবং এটি লগ করা হচ্ছে কিনা তা পরীক্ষা করে দেখছে। :)
বিকাল নেপাল

1

fs use path মডিউলটি ফোল্ডারটি পেতে পারে। এই ব্যবহার প্রতিশ্রুতি। যদি আপনার ভর্তি করবেন, আপনার করতে পারেন পরিবর্তন পাবেন isDirectory () থেকে isFile () Nodejs - FS - fs.Stats গত .At, আপনি file'name file'extname পেতে এবং তাই করতে Nodejs --- পথ

var fs = require("fs"),
path = require("path");
//your <MyFolder> path
var p = "MyFolder"
fs.readdir(p, function (err, files) {
    if (err) {
        throw err;
    }
    //this can get all folder and file under  <MyFolder>
    files.map(function (file) {
        //return file or folder path, such as **MyFolder/SomeFile.txt**
        return path.join(p, file);
    }).filter(function (file) {
        //use sync judge method. The file will add next files array if the file is directory, or not. 
        return fs.statSync(file).isDirectory();
    }).forEach(function (files) {
        //The files is array, so each. files is the folder name. can handle the folder.
        console.log("%s", files);
    });
});

পর্যালোচনা সারি থেকে: আমি আপনাকে অনুরোধ করতে দয়া করে আপনার উত্তর কাছাকাছি আরও কিছু প্রসঙ্গ যুক্ত করুন। কোড-কেবল উত্তরগুলি বোঝা মুশকিল। আপনি যদি আপনার পোস্টে আরও তথ্য যুক্ত করতে পারেন তবে এটি প্রশ্নকারী এবং ভবিষ্যতের পাঠকদের উভয়কেই সহায়তা করবে।
help-info.de

1

ES6 এর সাথে সম্পূর্ণ async সংস্করণ, কেবল নেটিভ প্যাকেজ, fs.promises এবং async / প্রতীক্ষা, ফাইল সমান্তরালে অপারেশন করে:

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

async function listDirectories(rootPath) {
    const fileNames = await fs.promises.readdir(rootPath);
    const filePaths = fileNames.map(fileName => path.join(rootPath, fileName));
    const filePathsAndIsDirectoryFlagsPromises = filePaths.map(async filePath => ({path: filePath, isDirectory: (await fs.promises.stat(filePath)).isDirectory()}))
    const filePathsAndIsDirectoryFlags = await Promise.all(filePathsAndIsDirectoryFlagsPromises);
    return filePathsAndIsDirectoryFlags.filter(filePathAndIsDirectoryFlag => filePathAndIsDirectoryFlag.isDirectory)
        .map(filePathAndIsDirectoryFlag => filePathAndIsDirectoryFlag.path);
}

পরীক্ষিত, এটি দুর্দান্ত কাজ করে।


0

কেবলমাত্র অন্য যে কোনও ওয়েব অনুসন্ধান থেকে এখানেই শেষ হয়েছে এবং গ্রান্ট ইতিমধ্যে তাদের নির্ভরতা তালিকায় রয়েছে, এর উত্তর তুচ্ছ হয়ে যায়। এখানে আমার সমাধান:

/**
 * Return all the subfolders of this path
 * @param {String} parentFolderPath - valid folder path
 * @param {String} glob ['/*'] - optional glob so you can do recursive if you want
 * @returns {String[]} subfolder paths
 */
getSubfolders = (parentFolderPath, glob = '/*') => {
    return grunt.file.expand({filter: 'isDirectory'}, parentFolderPath + glob);
}

0

অন্য পুনরাবৃত্তি পদ্ধতির

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

const getFiles = (dir, base = '') => readdirSync(dir, {withFileTypes: true}).reduce((files, file) => {
    const filePath = path.join(dir, file.name)
    const relativePath = path.join(base, file.name)
    if(file.isDirectory()) {
        return files.concat(getFiles(filePath, relativePath))
    } else if(file.isFile()) {
        file.__fullPath = filePath
        file.__relateivePath = relativePath
        return files.concat(file)
    }
}, [])

0

ফাংশনাল প্রোগ্রামিং

const fs = require('fs')
const path = require('path')
const R = require('ramda')

const getDirectories = pathName => {
    const isDirectory = pathName => fs.lstatSync(pathName).isDirectory()
    const mapDirectories = pathName => R.map(name => path.join(pathName, name), fs.readdirSync(pathName))
    const filterDirectories = listPaths => R.filter(isDirectory, listPaths)

    return {
        paths:R.pipe(mapDirectories)(pathName),
        pathsFiltered: R.pipe(mapDirectories, filterDirectories)(pathName)
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.