নোড.জেএস-তে ডিরেক্টরিতে উপস্থিত সমস্ত ফাইলের নামের তালিকা আপনি কীভাবে পাবেন?


979

আমি নোড.জেএস ব্যবহার করে একটি ডিরেক্টরিতে উপস্থিত সমস্ত ফাইলের নামের একটি তালিকা পাওয়ার চেষ্টা করছি আমি আউটপুট চাই যা ফাইলের নামের একটি অ্যারে। কিভাবে আমি এটি করতে পারব?


9
fs.readdirকাজ করে তবে ফাইলের নাম গ্লোব ধরণগুলি ব্যবহার করতে পারে না ls /tmp/*core*। পরীক্ষা করে দেখুন github.com/isaacs/node-glob । গ্লোবগুলি এমনকি উপ ডিরেক্টরিতেও অনুসন্ধান করতে পারে।
Jess

এনপিএমের readdir-recursiveমডিউলটি চেকআউট করুন যদিও আপনি যদি উপ-ডিরেক্টরিতেও ফাইলগুলির নাম সন্ধান করছেন
ইথান ডেভিস


1
fs.readdir একটি সাধারণ অ্যাসিঙ্ক সমাধান - উদাহরণ এখানে
আতঙ্কিত

এখনও একটি পুনরুক্তি ব্যবহার করে উত্তর না? আমি স্ক্যান করতে 2.5 মিলিয়ন ফাইল পেয়েছি… আমি 10 মিনিটের পরে 2.5 মিটার পথের একটি তালিকা পেতে চাই না।
ফ্ল্যাভিয়ান ভোলকেন

উত্তর:


1342

আপনি fs.readdirবা fs.readdirSyncপদ্ধতি ব্যবহার করতে পারেন ।

fs.readdir

const testFolder = './tests/';
const fs = require('fs');

fs.readdir(testFolder, (err, files) => {
  files.forEach(file => {
    console.log(file);
  });
});

fs.readdirSync

const testFolder = './tests/';
const fs = require('fs');

fs.readdirSync(testFolder).forEach(file => {
  console.log(file);
});

দুটি পদ্ধতির মধ্যে পার্থক্যটি হ'ল প্রথমটি হ'ল অ্যাসিনক্রোনাস, সুতরাং আপনাকে একটি কলব্যাক ফাংশন সরবরাহ করতে হবে যা পড়ার প্রক্রিয়াটি শেষ হলে কার্যকর করা হবে।

দ্বিতীয়টি সিঙ্ক্রোনাস, এটি ফাইলের নাম অ্যারে ফিরিয়ে দেবে, তবে পঠন প্রক্রিয়া শেষ না হওয়া অবধি এটি আপনার কোডের আর কোনও প্রয়োগ বন্ধ করে দেবে।


204
দ্রষ্টব্য: ডিরেক্টরিগুলির নামওreaddir দেখায় । এগুলি ফিল্টার করতে এবং ব্যবহার করুন । fs.stat(path, callback(err, stats))stats.isDirectory()
রব ডাব্লু

3
আমার যুক্ত করা উচিত যে সম্ভবত আপনি পঠনের সাথে যেতে হবে কারণ আপনি নোডে আইও ব্লক করতে চান না।
ড্রাগনকনাইট

5
@ ব্যবহারকারী3705055 যদি না আপনি উত্স অর্ডার নির্ভর ফাইলগুলির ডিরেক্টরিতে পড়তে এবং একটি একক এক্সিকিউটেবলের মধ্যে তাদের সংকলন করে ঝাল ব্যবহার করছেন।
r3wt


2
@ সানকারন আপনি কি আউটপুট পার্সিংয়ের চেষ্টা করতে চান ls? এম্বেড করা স্পেস এবং
নতুনলাইন

199

আইএমও এই জাতীয় কাজগুলি করার সবচেয়ে দৃ way় উপায় হ'ল গ্লোব সরঞ্জাম ব্যবহার করা । নোড.জেএস এর জন্য এখানে একটি গ্লোব প্যাকেজ' s সাথে ইনস্টল করুন

npm install glob

তারপরে ফাইলের নামগুলি মেলানোর জন্য ওয়াইল্ড কার্ড ব্যবহার করুন (উদাহরণস্বরূপ প্যাকেজের ওয়েবসাইট থেকে নেওয়া)

var glob = require("glob")

// options is optional
glob("**/*.js", options, function (er, files) {
  // files is an array of filenames.
  // If the `nonull` option is set, and nothing
  // was found, then files is ["**/*.js"]
  // er is an error object or null.
})

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

আমি এটি খুব পছন্দ করি কারণ গ্লোব্বিং নোডের প্রায় মৌলিক দক্ষতা। আপনি যদি কেবল ফাইলের নাম ফিরে পেতে চান cwdতবে বিকল্পগুলির মধ্যে একটি পাস করুন।
jcollum

1
কীভাবে globনিজের বাইরে ফলাফল পেতে পারে? যেমন। আমি console.logফলাফল চাই, কিন্তু ভিতরে না glob()?
ল্যান্টি

13
@ ল্যান্তি: glob.sync(pattern, [options])পদ্ধতিটি কলব্যাক ব্যবহার না করে কেবল ফাইলের একটি অ্যারে প্রদান করার কারণে এটি ব্যবহার করা সহজ হতে পারে। এখানে আরও তথ্য: github.com/isaacs/node-glob
গ্লেন লরেন্স

1
প্রতিশ্রুতি ব্যবহার করে আমার মতো লোকেরা গ্লোব বাস্তবায়নের সন্ধান করছেন, সিন্ড্রেসারস দ্বারা গ্লোবাই পরীক্ষা করে দেখুন: github.com/sindresorhus/globby
Nacho Coloma

180

উপরের উত্তরটি যদিও ডিরেক্টরিটিতে পুনরাবৃত্ত অনুসন্ধান করতে পারে না। এখানে কি আমি একটি recursive অনুসন্ধানের জন্য করলেন (ব্যবহার নোড-ভাত : npm install walk)

var walk    = require('walk');
var files   = [];

// Walker options
var walker  = walk.walk('./test', { followLinks: false });

walker.on('file', function(root, stat, next) {
    // Add this file to the list of files
    files.push(root + '/' + stat.name);
    next();
});

walker.on('end', function() {
    console.log(files);
});

4
fs.readdirSync ভাল, এর জন্য বিশেষভাবে তৈরি দেশীয় বিকল্প।
এরাদেন

37
দুর্ভাগ্যক্রমে fs.readdirSync সাব ডিরেক্টরিগুলিতে চলে না, যদি না আপনি কেবল নিজের কাজটি করতে নিজের রুটিন লিখতে ইচ্ছুক না হন, তবে আপনি এই সমস্যাটি সমাধানের জন্য ইতিমধ্যে এনপিএম মডিউল বের করে দিয়েছেন।
রুবেন টান

6
ওয়াক গিথুব
santiagoIT

কোন এপিআই পুনরাবৃত্তি পড়তে পারে সে সম্পর্কে ওপি জিজ্ঞাসা করেনি। যাই হোক না কেন, গৃহীত উত্তরটি পুনরাবৃত্তিযোগ্য পাঠযোগ্য করার জন্য ভিত্তি হিসাবে কী পরিবেশন করতে পারে তা সরবরাহ করে।
ইগ্বে কালু

এটি একটি দুর্দান্ত ফাংশন। দ্রুত প্রশ্ন: নির্দিষ্ট ডায়ারগুলিকে উপেক্ষা করার কোনও দ্রুত উপায় আছে? আমি দিয়ে শুরু ডিরেক্টরি উপেক্ষা করতে.git
j_d

91

সমস্ত সাবডিয়ারগুলিতে ফাইল পান

function getFiles (dir, files_){
    files_ = files_ || [];
    var files = fs.readdirSync(dir);
    for (var i in files){
        var name = dir + '/' + files[i];
        if (fs.statSync(name).isDirectory()){
            getFiles(name, files_);
        } else {
            files_.push(name);
        }
    }
    return files_;
}

console.log(getFiles('path/to/dir'))

4
কেন if (typeof files_ === 'undefined') files_=[];? আপনি কেবল var files_ = files_ || [];পরিবর্তে করতে হবে files_ = files_ || [];
জেকুটিসনকি

4
আপনি var fs = require('fs');শুরুতে যুক্ত করতে ভুলে গেছেন getFiles
GFoley83

এটি একটি পুনরাবৃত্তি পদ্ধতি। এটি খুব গভীর ফোল্ডার কাঠামো সমর্থন করে না, যার ফলে স্ট্যাক ওভারফ্লো হবে।
ম্যাথিয়াস লাইককেগার্ড লরেঞ্জেন

63

কেবল নেটিভ fsএবং pathমডিউলগুলি ব্যবহার করে এখানে একটি সহজ সমাধান রয়েছে :

// sync version
function walkSync(currentDirPath, callback) {
    var fs = require('fs'),
        path = require('path');
    fs.readdirSync(currentDirPath).forEach(function (name) {
        var filePath = path.join(currentDirPath, name);
        var stat = fs.statSync(filePath);
        if (stat.isFile()) {
            callback(filePath, stat);
        } else if (stat.isDirectory()) {
            walkSync(filePath, callback);
        }
    });
}

বা অ্যাসিঙ্ক সংস্করণ ( fs.readdirপরিবর্তে ব্যবহার করে):

// async version with basic error handling
function walk(currentDirPath, callback) {
    var fs = require('fs'),
        path = require('path');
    fs.readdir(currentDirPath, function (err, files) {
        if (err) {
            throw new Error(err);
        }
        files.forEach(function (name) {
            var filePath = path.join(currentDirPath, name);
            var stat = fs.statSync(filePath);
            if (stat.isFile()) {
                callback(filePath, stat);
            } else if (stat.isDirectory()) {
                walk(filePath, callback);
            }
        });
    });
}

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

walkSync('path/to/root/dir', function(filePath, stat) {
    // do something with "filePath"...
});

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

walk('path/to/root/dir', function(filePath, stat) {
    // do something with "filePath"...
});

পার্থক্যটি হ'ল আইও সম্পাদন করার সময় নোড কীভাবে অবরুদ্ধ হয়। উপরের API টি একই, আপনি সর্বাধিক কর্মক্ষমতা নিশ্চিত করতে কেবল async সংস্করণটি ব্যবহার করতে পারেন।

তবে সিঙ্ক্রোনাস সংস্করণ ব্যবহার করার একটি সুবিধা রয়েছে। হাঁটার পরে পরবর্তী বিবৃতি অনুসারে ওয়াকটি শেষ হওয়ার সাথে সাথে কিছু কোড কার্যকর করা আরও সহজ। অ্যাসিঙ্ক সংস্করণ সহ, আপনার কাজটি শেষ হওয়ার পরে আপনার কিছু অতিরিক্ত উপায়ের প্রয়োজন হবে। সম্ভবত প্রথমে সমস্ত পাথের মানচিত্র তৈরি করা, তারপরে সেগুলি গণনা করা। সাধারণ বিল্ড / ইউজার স্ক্রিপ্টগুলির জন্য (হাই পারফরম্যান্স ওয়েব সার্ভার বনাম) আপনি কোনও ক্ষতি না করে সিঙ্ক সংস্করণটি ব্যবহার করতে পারেন।


1
লাইন প্রতিস্থাপন করা উচিত walkSyncথেকে walk(filePath, callback);থেকেwalkSync(filePath, callback);
MIDE11

3
তবে আপনি এখনও fs.statSync ব্যবহার করছেন, যা অ্যাসিঙ্ক সংস্করণে ব্লক করে। পরিবর্তে আপনি fs.stat ব্যবহার করা উচিত নয়?
মাইন্ডলেস রেঞ্জার

এটি সত্যই সহায়ক এবং এই পদ্ধতিটি পুনরাবৃত্ত হয়। ধন্যবাদ!
ছোট রাইস

35

নোড v10.10.0 পর্যন্ত এটা নতুন ব্যবহার করা সম্ভব withFileTypesজন্য বিকল্প fs.readdirএবং fs.readdirSyncসঙ্গে একযোগে dirent.isDirectory()ফাংশন একটি ডিরেক্টরির মধ্যে ফাইলের নামের জন্য ফিল্টার করতে। এটি দেখতে এরকম দেখাচ্ছে:

fs.readdirSync('./dirpath', {withFileTypes: true})
.filter(item => !item.isDirectory())
.map(item => item.name)

ফিরে আসা অ্যারেটি ফর্মটিতে রয়েছে:

['file1.txt', 'file2.txt', 'file3.txt']

Fs.Dirent বর্গের জন্য দস্তাবেজ


7
এখন পর্যন্ত এটি এখানে সেরা উত্তর!
অ্যালেক্স আইভ্যাসিভ

2
এটিই লোকেরা 2020-এ অনুসন্ধান করছে - "পিন করা উচিত"
রেডচেনকো

1
সেরা উত্তর 2020!
ইয়ভেস ল্যাঞ্জ

26

ES7 এর সাথে প্রতিশ্রুতি ব্যবহার করা

এমজেড / এফএস সহ অ্যাসিঙ্ক্রোনাস ব্যবহার

mzমডিউল কোর নোড লাইব্রেরির promisified সংস্করণ প্রদান করে। এগুলি ব্যবহার করা সহজ। প্রথমে পাঠাগারটি ইনস্টল করুন ...

npm install mz

তারপর ...

const fs = require('mz/fs');
fs.readdir('./myDir').then(listing => console.log(listing))
  .catch(err => console.error(err));

বিকল্পভাবে আপনি এএস 7 তে অ্যাসিঙ্ক্রোনাস ফাংশনে এগুলি লিখতে পারেন:

async function myReaddir () {
  try {
    const file = await fs.readdir('./myDir/');
  }
  catch (err) { console.error( err ) }
};

পুনরাবৃত্ত তালিকার জন্য আপডেট

কিছু ব্যবহারকারীর পুনরাবৃত্ত তালিকা (যদিও প্রশ্নে নেই) দেখার একটি ইচ্ছা নির্দিষ্ট করেছে ... ব্যবহার করুন fs-promise। এটি চারপাশে একটি পাতলা মোড়ক mz

npm install fs-promise;

তারপর ...

const fs = require('fs-promise');
fs.walk('./myDir').then(
    listing => listing.forEach(file => console.log(file.path))
).catch(err => console.error(err));

5
fs.walk এফএস-প্রতিশ্রুতি থেকে সরানো হয়েছে কারণ এটি fs ( github.com/kevinbeaty/fs-promise/issues/28 ) দ্বারা সমর্থিত নয়
আদনান

20

নির্ভরতা।

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

সংজ্ঞা।

// String -> [String]
function fileList(dir) {
  return fs.readdirSync(dir).reduce(function(list, file) {
    var name = path.join(dir, file);
    var isDir = fs.statSync(name).isDirectory();
    return list.concat(isDir ? fileList(name) : [name]);
  }, []);
}

ব্যবহারের।

var DIR = '/usr/local/bin';

// 1. List all files in DIR
fileList(DIR);
// => ['/usr/local/bin/babel', '/usr/local/bin/bower', ...]

// 2. List all file names in DIR
fileList(DIR).map((file) => file.split(path.sep).slice(-1)[0]);
// => ['babel', 'bower', ...]

দয়া করে নোট করুন যে fileListউপায় খুব আশাবাদী। গুরুতর যে কোনও কিছুর জন্য, কিছু ত্রুটি পরিচালনা করা যুক্ত করুন।


1
আমি একটি excludeDirsঅ্যারে যুক্তিও যুক্ত করেছি । এটি এটিকে যথেষ্ট পরিবর্তন করে যাতে আপনার পরিবর্তে এটি সম্পাদনা করা উচিত (যদি আপনি এটি চান) want অন্যথায় আমি এটি একটি অন্য উত্তরে যুক্ত করব। gist.github.com/AlecTaylor/f3f221b4fb86b4375650

1
পছন্দ করুন আপনার নিজের উত্তর পোস্ট করা উচিত, কারণ এটি একটি কার্যকর এক্সটেনশন। আসুন এটি একটি বৈশিষ্ট্যহীন রাখুন।
হুনান রোস্তোমায়ান

19

পুনরাবৃত্তিযোগ্য সংস্করণ

আপনি বলেন না যে আপনি এটি পুনরাবৃত্তভাবে করতে চান তাই আমি ধরে নিই আপনার কেবল ডিরেক্টরিটির সরাসরি বাচ্চাদের দরকার।

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

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

fs.readdirSync('your-directory-path')
  .filter((file) => fs.lstatSync(path.join(folder, file)).isFile());

10

লোড fs:

const fs = require('fs');

ফাইলগুলি অ্যাসিঙ্ক পড়ুন :

fs.readdir('./dir', function (err, files) {
    // "files" is an Array with files names
});

ফাইল সিঙ্ক পড়ুন :

var files = fs.readdirSync('./dir');

10

যদি এখনও কেউ এটি সন্ধান করে তবে আমি এটি করি:

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

const getAllFiles = dir =>
    fs.readdirSync(dir).reduce((files, file) => {
        const name = path.join(dir, file);
        const isDirectory = fs.statSync(name).isDirectory();
        return isDirectory ? [...files, ...getAllFiles(name)] : [...files, name];
    }, []);

এবং এটির কাজটি আমার পক্ষে খুব ভাল


আমার জন্য দুর্দান্ত কাজ করেছে এবং এটি পুনরাবৃত্ত হয়। কেবল মনে রাখবেন যে আমদানি বাক্য গঠনটি নোডের মধ্যে এখনও একটি পতাকার পিছনে রয়েছে, আপনাকে পুরানো পথে যেতে হতে পারে: কনস্ট fs = প্রয়োজনীয় ('fs');
mjsarfatti

@ জোশ এটি মোহন মত কাজ করে। তবে কীভাবে [...files, ...getAllFiles(name)]বা কীভাবে [...files, name]কাজ করে তা বুঝতে কিছুটা অসুবিধা হচ্ছে । কিছুটা ব্যাখ্যা খুব সহায়ক হবে :)
মোঃ মাজেদুল ইসলাম খান

1
নিবন্ধন করুন ... ব্যবহৃত ব্যবহৃত একটি স্প্রেড সিনট্যাক্স বলা হয়। এটি মূলত যা করে তা হ'ল অ্যারের মধ্যে সমস্ত বস্তু নিয়ে যায় এবং এটিকে নতুন অ্যারেতে 'স্প্রেড' করে। এই ক্ষেত্রে, filesঅ্যারের ভিতরে থাকা সমস্ত এন্ট্রিগুলি পুনরাবৃত্তির কল থেকে ফিরে আসা সমস্ত মানগুলির সাথে রিটার্নে যুক্ত হয়। আপনি স্প্রেড সিনট্যাক্সটি এখানে উল্লেখ করতে পারেন: developer.mozilla.org/en-US/docs/Web/JavaScript/References/…
T90

8

sortedফাইলের নাম পান । আপনি একটি নির্দিষ্ট উপর ভিত্তি করে ফলাফল ফিল্টার করতে পারেন extensionযেমন '.txt', '.jpg'ইত্যাদি।

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

function getFilenames(path, extension) {
    return fs
        .readdirSync(path)
        .filter(
            item =>
                fs.statSync(Path.join(path, item)).isFile() &&
                (extension === undefined || Path.extname(item) === extension)
        )
        .sort();
}

6

আমি আপনার প্রশ্ন থেকে ধরে নিচ্ছি যে আপনি ডিরেক্টরি নাম চান না, শুধু ফাইল।

উদাহরণ:

animals
├── all.jpg
├── mammals
   └── cat.jpg
   └── dog.jpg
└── insects
    └── bee.jpg

আপনি যদি চান কেবলমাত্র একটি অ্যারের ফাইলের পাথ ব্যবহার করেন return_object: false:

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

async function walk(dir) {
    let files = await fs.readdir(dir);
    files = await Promise.all(files.map(async file => {
        const filePath = path.join(dir, file);
        const stats = await fs.stat(filePath);
        if (stats.isDirectory()) return walk(filePath);
        else if(stats.isFile()) return filePath;
    }));

    return files.reduce((all, folderContents) => all.concat(folderContents), []);
}

console.log(walk('animals'))

আয়:

[
  "/animals/all.jpg",
  "/animals/mammals/cat.jpg",
  "/animals/mammals/dog.jpg",
  "/animals/insects/bee.jpg"
];

ক্রেডিটগুলি https://gist.github.com/lovaoa/8691344#gistcomment-2927279 এ যান


5

এখানে একটি অ্যাসিনক্রোনাস পুনরাবৃত্তি সংস্করণ।

    function ( path, callback){
     // the callback gets ( err, files) where files is an array of file names
     if( typeof callback !== 'function' ) return
     var
      result = []
      , files = [ path.replace( /\/\s*$/, '' ) ]
     function traverseFiles (){
      if( files.length ) {
       var name = files.shift()
       fs.stat(name, function( err, stats){
        if( err ){
         if( err.errno == 34 ) traverseFiles()
    // in case there's broken symbolic links or a bad path
    // skip file instead of sending error
         else callback(err)
        }
        else if ( stats.isDirectory() ) fs.readdir( name, function( err, files2 ){
         if( err ) callback(err)
         else {
          files = files2
           .map( function( file ){ return name + '/' + file } )
           .concat( files )
          traverseFiles()
         }
        })
        else{
         result.push(name)
         traverseFiles()
        }
       })
      }
      else callback( null, result )
     }
     traverseFiles()
    }

4
আপনার বিবৃতি শেষে অর্ধিকলন যুক্ত অভ্যাসে পান। আপনি অন্যথায় কোড মাইনাইফ করতে পারবেন না। তবুও, প্রয়োজনীয় এ্যাসিঙ্ক অবদানের জন্য ধন্যবাদ।
ব্যবহারকারী 2867288

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

@ ব্যবহারকারী 2867288 তবে যেহেতু এএসআই রয়েছে, আমরা এটি ব্যবহার করতে পারি, না? নিয়মিত সংরক্ষণে আমার কোডটি ফর্ম্যাট করতে আমি এসিলিন্ট এবং প্রিটটিয়ার ব্যবহার করি এবং সেমিকোলন সন্নিবেশ একটি নন-ইস্যু।
দোইরা

5

@ হুনান-রোস্টোমায়ানের সাধারণ দৃষ্টিভঙ্গি গ্রহণ করেছেন, এটি একটি লিটলকে আরও সংক্ষিপ্ত এবং excludeDirsযুক্তিযুক্ত যুক্ত করেছে। এটির সাথে প্রসারিত করা তুচ্ছ হবে includeDirs, কেবল একই প্যাটার্নটি অনুসরণ করুন:

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

function fileList(dir, excludeDirs?) {
    return fs.readdirSync(dir).reduce(function (list, file) {
        const name = path.join(dir, file);
        if (fs.statSync(name).isDirectory()) {
            if (excludeDirs && excludeDirs.length) {
                excludeDirs = excludeDirs.map(d => path.normalize(d));
                const idx = name.indexOf(path.sep);
                const directory = name.slice(0, idx === -1 ? name.length : idx);
                if (excludeDirs.indexOf(directory) !== -1)
                    return list;
            }
            return list.concat(fileList(name, excludeDirs));
        }
        return list.concat([name]);
    }, []);
}

ব্যবহারের উদাহরণ:

console.log(fileList('.', ['node_modules', 'typings', 'bower_components']));

আমার একটি মূল ফোল্ডার রয়েছে: scss, এবং এর ভিতরে অন্যান্য ফোল্ডার: থিমস, তবে চূড়ান্ত তালিকাটি আমাকে সমস্ত ডিরেক্টরি দেয়, কেবল ডিরেক্টরীকে বাদ না দিয়ে ডিরেক্টরিগুলিই, কী ঘটে?
সালাহএডডিন

শুধুমাত্র '' দিয়ে ঠিকঠাক কাজ করে। ফোল্ডার ডিরেক্টরি, বাকি ডিরেক্টরি কাজ করে না।
সালাহএডডিন

5

বাক্সের বাইরে

আপনি যদি বাক্সের বাইরে ডিরেক্টরি কাঠামোযুক্ত কোনও অবজেক্ট চান তবে আমি আপনাকে ডিরেক্টরি-ট্রি পরীক্ষা করার জন্য অত্যন্ত অনুরোধ করি

আপনাকে এই কাঠামো আছে বলে দেয়:

photos
   june
   └── windsurf.jpg
└── january
    ├── ski.png
    └── snowboard.jpg
const dirTree = require("directory-tree");
const tree = dirTree("/path/to/photos");

ফিরে আসবে:

{
  path: "photos",
  name: "photos",
  size: 600,
  type: "directory",
  children: [
    {
      path: "photos/june",
      name: "june",
      size: 400,
      type: "directory",
      children: [
        {
          path: "photos/june/windsurf.jpg",
          name: "windsurf.jpg",
          size: 400,
          type: "file",
          extension: ".jpg"
        }
      ]
    },
    {
      path: "photos/january",
      name: "january",
      size: 200,
      type: "directory",
      children: [
        {
          path: "photos/january/ski.png",
          name: "ski.png",
          size: 100,
          type: "file",
          extension: ".png"
        },
        {
          path: "photos/january/snowboard.jpg",
          name: "snowboard.jpg",
          size: 100,
          type: "file",
          extension: ".jpg"
        }
      ]
    }
  ]
}

কাস্টম অবজেক্ট

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

// my-script.js
const fs = require("fs");
const path = require("path");

const isDirectory = filePath => fs.statSync(filePath).isDirectory();
const isFile = filePath => fs.statSync(filePath).isFile();

const getDirectoryDetails = filePath => {
  const dirs = fs.readdirSync(filePath);
  return {
    dirs: dirs.filter(name => isDirectory(path.join(filePath, name))),
    files: dirs.filter(name => isFile(path.join(filePath, name)))
  };
};

const getFilesRecursively = (parentPath, currentFolder) => {
  const currentFolderPath = path.join(parentPath, currentFolder);
  let currentDirectoryDetails = getDirectoryDetails(currentFolderPath);

  const final = {
    current_dir: currentFolder,
    dirs: currentDirectoryDetails.dirs.map(dir =>
      getFilesRecursively(currentFolderPath, dir)
    ),
    files: currentDirectoryDetails.files
  };

  return final;
};

const getAllFiles = relativePath => {
  const fullPath = path.join(__dirname, relativePath);
  const parentDirectoryPath = path.dirname(fullPath);
  const leafDirectory = path.basename(fullPath);

  const allFiles = getFilesRecursively(parentDirectoryPath, leafDirectory);
  return allFiles;
};

module.exports = { getAllFiles };

তারপরে আপনি সহজভাবে এটি করতে পারেন:

// another-file.js 

const { getAllFiles } = require("path/to/my-script");

const allFiles = getAllFiles("/path/to/my-directory");

3

এটি একটি টাইপসক্রিপ্ট, allyচ্ছিকভাবে পুনরাবৃত্তিযোগ্য, allyচ্ছিকভাবে ত্রুটি লগিং এবং অ্যাসিনক্রোনাস সমাধান। আপনি যে ফাইলের নামগুলি খুঁজতে চান তার জন্য আপনি একটি নিয়মিত অভিব্যক্তি নির্দিষ্ট করতে পারেন।

আমি ব্যবহার করেছি fs-extra, কারণ এটি একটি সহজ সুপার সেট উন্নতি fs

import * as FsExtra from 'fs-extra'

/**
 * Finds files in the folder that match filePattern, optionally passing back errors .
 * If folderDepth isn't specified, only the first level is searched. Otherwise anything up
 * to Infinity is supported.
 *
 * @static
 * @param {string} folder The folder to start in.
 * @param {string} [filePattern='.*'] A regular expression of the files you want to find.
 * @param {(Error[] | undefined)} [errors=undefined]
 * @param {number} [folderDepth=0]
 * @returns {Promise<string[]>}
 * @memberof FileHelper
 */
public static async findFiles(
    folder: string,
    filePattern: string = '.*',
    errors: Error[] | undefined = undefined,
    folderDepth: number = 0
): Promise<string[]> {
    const results: string[] = []

    // Get all files from the folder
    let items = await FsExtra.readdir(folder).catch(error => {
        if (errors) {
            errors.push(error) // Save errors if we wish (e.g. folder perms issues)
        }

        return results
    })

    // Go through to the required depth and no further
    folderDepth = folderDepth - 1

    // Loop through the results, possibly recurse
    for (const item of items) {
        try {
            const fullPath = Path.join(folder, item)

            if (
                FsExtra.statSync(fullPath).isDirectory() &&
                folderDepth > -1)
            ) {
                // Its a folder, recursively get the child folders' files
                results.push(
                    ...(await FileHelper.findFiles(fullPath, filePattern, errors, folderDepth))
                )
            } else {
                // Filter by the file name pattern, if there is one
                if (filePattern === '.*' || item.search(new RegExp(filePattern, 'i')) > -1) {
                    results.push(fullPath)
                }
            }
        } catch (error) {
            if (errors) {
                errors.push(error) // Save errors if we wish
            }
        }
    }

    return results
}

1

এটি একই ডিরেক্টরিতে উপস্থিত টেস্ট.টেক্সট ফাইলটিতে ফলাফল কাজ করবে এবং সংরক্ষণ করবে

  fs.readdirSync(__dirname).forEach(file => {
    fs.appendFileSync("test.txt", file+"\n", function(err){
    })
})

1

আমি সম্প্রতি এটির জন্য একটি সরঞ্জাম তৈরি করেছি যা এটি কেবল এটি করে ... এটি অ্যাসিক্রোনারিকভাবে একটি ডিরেক্টরি এনে আইটেমগুলির একটি তালিকা ফেরত দেয়। ফোল্ডার প্রথম হওয়ার সাথে সাথে আপনি ডিরেক্টরি, ফাইল বা উভয়ই পেতে পারেন। আপনি যেখানে পুরো ফোল্ডারটি আনতে চান না সে ক্ষেত্রে আপনি ডেটাও পৃষ্ঠাতে পারেন।

https://www.npmjs.com/package/fs-browser

এই লিঙ্কটি, আশা করি এটি কাউকে সাহায্য করবে!


0

কেবলমাত্র শীর্ষস্থানীয়: আপনি যদি কোনও ডিরেক্টরিতে প্রতিটি ফাইলে অপারেশন করার পরিকল্পনা করে থাকেন তবে ভিনাইল-এফএস ব্যবহার করুন (যা স্ট্রিমিং বিল্ড সিস্টেম গাল্প দ্বারা ব্যবহৃত হয় )।


0

আমি এই কাজটি স্বয়ংক্রিয় করতে একটি নোড মডিউল তৈরি করেছি: এমডিডিআর

ব্যবহার

নোড এমডিডির ".. / সম্পর্কিত / পাথ /"

ইনস্টল করতে: এনডিএম ইনস্টল করুন mddir -g

বর্তমান ডিরেক্টরিতে মার্কডাউন উত্পন্ন করতে: mddir ir

যে কোনও পরম পাথের জন্য উত্পন্ন করতে: এমডিডিআর / পরম / পথ

আপেক্ষিক পাথ তৈরি করতে: এমডিডিআর / ডকুমেন্টস / যাই হোক না কেন।

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

বর্তমানে নোড_মডিউলগুলি এবং .git ফোল্ডারগুলি উপেক্ষা করে।

সমস্যা সমাধান

আপনি যদি 'নোড \ r: ত্রুটিযুক্ত কোনও ফাইল বা ডিরেক্টরি' ত্রুটিটি পেয়ে থাকেন তবে সমস্যাটি হ'ল আপনার অপারেটিং সিস্টেমটি বিভিন্ন লাইন সমাপ্তি ব্যবহার করে এবং এমডিডিআর আপনি স্পষ্টভাবে ইউনিক্সে লাইন শেষের স্টাইল সেট না করে পার্স করতে পারবেন না। এটি সাধারণত উইন্ডোজকে প্রভাবিত করে, তবে লিনাক্সের কয়েকটি সংস্করণও affects ইউনিক্স শৈলীতে লাইন এন্ডিং সেট করা mddir এনপিএম গ্লোবাল বিন ফোল্ডারের মধ্যে সঞ্চালন করতে হবে।

লাইন শেষ সংশোধন

এর সাথে এনপিএম বিন ফোল্ডার পাথ পান:

npm config get prefix

সেই ফোল্ডারে সিডি করুন

ব্রু ইনস্টল ডস 2 ইউনিক্স

ডস 2 ইউনিক্স লাইব / নোড_মডিউলস / এমডিডিআর / এসসিআর / এমডিডিআর.জেএস

এটি ডসের পরিবর্তে লাইন এন্ডিংকে ইউনিক্সে রূপান্তর করে

তারপরে স্বাভাবিক হিসাবে চালান: নোড এমডিডির ".. / সম্পর্কিত / পাথ /"।

উত্পন্ন মার্কডাউন ফাইল কাঠামো 'ডিরেক্টরীলিস্ট.এমডি' উদাহরণ

    |-- .bowerrc
    |-- .jshintrc
    |-- .jshintrc2
    |-- Gruntfile.js
    |-- README.md
    |-- bower.json
    |-- karma.conf.js
    |-- package.json
    |-- app
        |-- app.js
        |-- db.js
        |-- directoryList.md
        |-- index.html
        |-- mddir.js
        |-- routing.js
        |-- server.js
        |-- _api
            |-- api.groups.js
            |-- api.posts.js
            |-- api.users.js
            |-- api.widgets.js
        |-- _components
            |-- directives
                |-- directives.module.js
                |-- vendor
                    |-- directive.draganddrop.js
            |-- helpers
                |-- helpers.module.js
                |-- proprietary
                    |-- factory.actionDispatcher.js
            |-- services
                |-- services.cardTemplates.js
                |-- services.cards.js
                |-- services.groups.js
                |-- services.posts.js
                |-- services.users.js
                |-- services.widgets.js
        |-- _mocks
            |-- mocks.groups.js
            |-- mocks.posts.js
            |-- mocks.users.js
            |-- mocks.widgets.js

0

npm তালিকা-সামগ্রী মডিউলটি ব্যবহার করুন । এটি প্রদত্ত ডিরেক্টরিটির বিষয়বস্তু এবং উপ-সামগ্রীগুলি পড়ে এবং ফাইল এবং ফোল্ডারগুলির পাথের তালিকা প্রদান করে returns

const list = require('list-contents');

list("./dist",(o)=>{
  if(o.error) throw o.error;
   console.log('Folders: ', o.dirs);
   console.log('Files: ', o.files);
});

-1
function getFilesRecursiveSync(dir, fileList, optionalFilterFunction) {
    if (!fileList) {
        grunt.log.error("Variable 'fileList' is undefined or NULL.");
        return;
    }
    var files = fs.readdirSync(dir);
    for (var i in files) {
        if (!files.hasOwnProperty(i)) continue;
        var name = dir + '/' + files[i];
        if (fs.statSync(name).isDirectory()) {
            getFilesRecursiveSync(name, fileList, optionalFilterFunction);
        } else {
            if (optionalFilterFunction && optionalFilterFunction(name) !== true)
                continue;
            fileList.push(name);
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.