Hướng dẫn nodejs read dir recursive - nodejs đọc đệ quy dir

Ngắn, hiện đại và hiệu quả:

import {readdir} from 'node:fs/promises'
import {join} from 'node:path'

const deepReadDir = async (dirPath) => await Promise.all(
  (await readdir(dirPath, {withFileTypes: true})).map(async (dirent) => {
    const path = join(dirPath, dirent.name)
    return dirent.isDirectory() ? await deepReadDir(path) : path
  }),
)

Đặc biệt cảm ơn chức năng đã sử dụng

[
  [
    'src/client/api.js',
    'src/client/http-constants.js',
    'src/client/index.html',
    'src/client/index.js',
    [ 'src/client/res/favicon.ico' ],
    'src/client/storage.js'
  ],
  [ 'src/crypto/keygen.js' ],
  'src/discover.js',
  [
    'src/mutations/createNewMutation.js',
    'src/mutations/newAccount.js',
    'src/mutations/transferCredit.js',
    'src/mutations/updateApp.js'
  ],
  [
    'src/server/authentication.js',
    'src/server/handlers.js',
    'src/server/quick-response.js',
    'src/server/server.js',
    'src/server/static-resources.js'
  ],
  [ 'src/util/prompt.js', 'src/util/safeWriteFile.js' ],
  'src/util.js'
]
9.

Tự động này gấp từng đường dẫn lồng vào một mảng (lồng nhau) mới. Ví dụ: nếu:

const files = await deepReadDir('src')

files.flat(Number.POSITIVE_INFINITY)
0 sẽ như thế này:

[
  [
    'src/client/api.js',
    'src/client/http-constants.js',
    'src/client/index.html',
    'src/client/index.js',
    [ 'src/client/res/favicon.ico' ],
    'src/client/storage.js'
  ],
  [ 'src/crypto/keygen.js' ],
  'src/discover.js',
  [
    'src/mutations/createNewMutation.js',
    'src/mutations/newAccount.js',
    'src/mutations/transferCredit.js',
    'src/mutations/updateApp.js'
  ],
  [
    'src/server/authentication.js',
    'src/server/handlers.js',
    'src/server/quick-response.js',
    'src/server/server.js',
    'src/server/static-resources.js'
  ],
  [ 'src/util/prompt.js', 'src/util/safeWriteFile.js' ],
  'src/util.js'
]

Nhưng bạn có thể dễ dàng làm phẳng nó:

files.flat(Number.POSITIVE_INFINITY)
[
  'src/client/api.js',
  'src/client/http-constants.js',
  'src/client/index.html',
  'src/client/index.js',
  'src/client/res/favicon.ico',
  'src/client/storage.js',
  'src/crypto/keygen.js',
  'src/discover.js',
  'src/mutations/createNewMutation.js',
  'src/mutations/newAccount.js',
  'src/mutations/transferCredit.js',
  'src/mutations/updateApp.js',
  'src/server/authentication.js',
  'src/server/handlers.js',
  'src/server/quick-response.js',
  'src/server/server.js',
  'src/server/static-resources.js',
  'src/util/prompt.js',
  'src/util/safeWriteFile.js',
  'src/util.js'
]

Tôi có một vấn đề nhỏ với chức năng của tôi. Tôi muốn có được tất cả các tập tin trong nhiều thư mục. Hiện tại, tôi có thể truy xuất các tệp trong tệp được truyền trong các tham số. Tôi muốn truy xuất các tệp HTML của mỗi thư mục trong thư mục được truyền dưới dạng tham số. Tôi sẽ giải thích nếu tôi đặt tham số "Kiểm tra" Tôi lấy các tệp trong "Kiểm tra" nhưng tôi muốn truy xuất "Test / 1 / *. Html", "Test / 2 /. /.Html":

var srcpath2 = path.join('.', 'diapo', result);
function getDirectories(srcpath2) {
                return fs.readdirSync(srcpath2).filter(function (file) {
                    return fs.statSync(path.join(srcpath2, file)).isDirectory();
                });
            }

Kết quả: [1,2,3]

cảm ơn !

Đã hỏi ngày 4 tháng 1 năm 2017 lúc 11:22Jan 4, 2017 at 11:22

Có vẻ như gói

files.flat(Number.POSITIVE_INFINITY)
1 NPM sẽ giúp bạn. Dưới đây là một ví dụ về cách sử dụng nó:

Phân cấp tệp:

test
├── one.html
└── test-nested
    └── two.html

Mã JS:

const glob = require("glob");

var getDirectories = function (src, callback) {
  glob(src + '/**/*', callback);
};
getDirectories('test', function (err, res) {
  if (err) {
    console.log('Error', err);
  } else {
    console.log(res);
  }
});

hiển thị nào:

[ 'test/one.html',
  'test/test-nested',
  'test/test-nested/two.html' ]

GầnHusCarl

47.6K12 Huy hiệu vàng188 Huy hiệu bạc172 Huy hiệu đồng12 gold badges188 silver badges172 bronze badges

Đã trả lời ngày 4 tháng 1 năm 2017 lúc 11:32Jan 4, 2017 at 11:32

Paul Mougelpaul MougelPaul Mougel

16.3k5 Huy hiệu vàng54 Huy hiệu bạc63 Huy hiệu Đồng5 gold badges54 silver badges63 bronze badges

3

Tôi đã thấy nhiều câu trả lời rất dài, và đó là một sự lãng phí không gian bộ nhớ. Một số cũng sử dụng các gói như

files.flat(Number.POSITIVE_INFINITY)
1, nhưng nếu bạn không muốn phụ thuộc vào bất kỳ gói nào, đây là giải pháp của tôi.

const Path = require("path");
const FS   = require("fs");
let Files  = [];

function ThroughDirectory(Directory) {
    FS.readdirSync(Directory).forEach(File => {
        const Absolute = Path.join(Directory, File);
        if (FS.statSync(Absolute).isDirectory()) return ThroughDirectory(Absolute);
        else return Files.push(Absolute);
    });
}

ThroughDirectory("./input/directory/");

Nó khá tự giải thích. Có một thư mục đầu vào, và nó lặp lại thông qua đó. Nếu một trong các mục cũng là một thư mục, hãy đi qua đó và cứ thế. Nếu đó là một tệp, hãy thêm đường dẫn tuyệt đối vào mảng.

Hy vọng điều này có ích:]

Đã trả lời ngày 27 tháng 7 năm 2020 lúc 8:25Jul 27, 2020 at 8:25

SmallymallySmally

1.2161 Huy hiệu vàng7 Huy hiệu bạc22 Huy hiệu đồng1 gold badge7 silver badges22 bronze badges

1

Sử dụng năng suất ES6

const files = await deepReadDir('src')
0

Đã trả lời ngày 6 tháng 2 năm 2021 lúc 23:31Feb 6, 2021 at 23:31

StephenstephenStephen

3.2181 Huy hiệu vàng21 Huy hiệu bạc20 Huy hiệu đồng1 gold badge21 silver badges20 bronze badges

2

Tôi thực sự thích giải pháp của Smally nhưng không thích cú pháp.

Cùng một giải pháp nhưng dễ đọc hơn một chút:

const files = await deepReadDir('src')
1

Đã trả lời ngày 13 tháng 2 năm 2021 lúc 16:07Feb 13, 2021 at 16:07

ArthurdentarthurdentarthurDent

6257 Huy hiệu bạc10 Huy hiệu đồng7 silver badges10 bronze badges

1

Đây là của tôi. Giống như tất cả các câu trả lời hay, thật khó hiểu:

const files = await deepReadDir('src')
2

Đã trả lời ngày 26 tháng 11 năm 2017 lúc 2:45Nov 26, 2017 at 2:45

user875234user875234user875234

2.2536 huy hiệu vàng28 Huy hiệu bạc45 Huy hiệu đồng6 gold badges28 silver badges45 bronze badges

3

Với JavaScript hiện đại (NodeJS 10), bạn có thể sử dụng hàm máy phát Async và lặp qua chúng bằng cách sử dụng Bình chờ ... của

const files = await deepReadDir('src')
3

Đã trả lời ngày 16 tháng 10 năm 2020 lúc 8:22Oct 16, 2020 at 8:22

Mikabytesmikabytemikabytes

1.7282 Huy hiệu vàng17 Huy hiệu bạc29 Huy hiệu đồng2 gold badges17 silver badges29 bronze badges

2

Đóng gói vào thư viện: https://www.npmjs.com/package/node-cecursive-directory

https://github.com/vvmspace/node-recursive-directory

Danh sách các tệp:

const files = await deepReadDir('src')
4

Danh sách các tệp có dữ liệu phân tích cú pháp:

const files = await deepReadDir('src')
5

Bạn sẽ nhận được một cái gì đó như thế:

const files = await deepReadDir('src')
6

Tối đa

6.4563 huy hiệu vàng41 Huy hiệu bạc57 Huy hiệu đồng3 gold badges41 silver badges57 bronze badges

Đã trả lời ngày 24 tháng 6 năm 2020 lúc 14:42Jun 24, 2020 at 14:42

2

Bạn cũng có thể viết mã của riêng mình như bên dưới để đi qua thư mục như được hiển thị bên dưới:

const files = await deepReadDir('src')
7

Bạn có thể kiểm tra thêm thông tin về nó tại đây: http://www.codingdefined.com/2014/09/how-to-navigate-through-directories-in.html

Đã trả lời ngày 5 tháng 1 năm 2017 lúc 11:13Jan 5, 2017 at 11:13

CodingDefinedCodingDefinedCodingDefined

1.9621 Huy hiệu vàng15 Huy hiệu bạc13 Huy hiệu đồng1 gold badge15 silver badges13 bronze badges

2

Tôi cần phải như vậy một cái gì đó tương tự, trong một ứng dụng electron: Nhận tất cả các thư mục con trong một thư mục cơ sở nhất định, sử dụng TypeScript và đưa ra điều này:

const files = await deepReadDir('src')
8

Đã trả lời ngày 7 tháng 11 năm 2017 lúc 15:09Nov 7, 2017 at 15:09

BenbenBen

1.1292 Huy hiệu vàng17 Huy hiệu bạc26 Huy hiệu đồng2 gold badges17 silver badges26 bronze badges

const files = await deepReadDir('src')
9

Điều này sẽ điền vào FileScollection với tất cả các tệp trong thư mục và các thư mục con của nó (đó là đệ quy). Bạn có tùy chọn bỏ qua một số tên thư mục trong mảng đạo diễn.filesCollection with all the files in the directory and its subdirectories (it's recursive). You have the option to skip some directory names in the directoriesToSkip array.

Đã trả lời ngày 19 tháng 3 năm 2018 lúc 12:54Mar 19, 2018 at 12:54

vvn050vvn050vvn050

1191 Huy hiệu bạc3 Huy hiệu đồng1 silver badge3 bronze badges

Nói về các gói NPM-Một tùy chọn ngắn khác là sử dụng FS-readdir-Recursive:

[
  [
    'src/client/api.js',
    'src/client/http-constants.js',
    'src/client/index.html',
    'src/client/index.js',
    [ 'src/client/res/favicon.ico' ],
    'src/client/storage.js'
  ],
  [ 'src/crypto/keygen.js' ],
  'src/discover.js',
  [
    'src/mutations/createNewMutation.js',
    'src/mutations/newAccount.js',
    'src/mutations/transferCredit.js',
    'src/mutations/updateApp.js'
  ],
  [
    'src/server/authentication.js',
    'src/server/handlers.js',
    'src/server/quick-response.js',
    'src/server/server.js',
    'src/server/static-resources.js'
  ],
  [ 'src/util/prompt.js', 'src/util/safeWriteFile.js' ],
  'src/util.js'
]
0

Output:

[
  [
    'src/client/api.js',
    'src/client/http-constants.js',
    'src/client/index.html',
    'src/client/index.js',
    [ 'src/client/res/favicon.ico' ],
    'src/client/storage.js'
  ],
  [ 'src/crypto/keygen.js' ],
  'src/discover.js',
  [
    'src/mutations/createNewMutation.js',
    'src/mutations/newAccount.js',
    'src/mutations/transferCredit.js',
    'src/mutations/updateApp.js'
  ],
  [
    'src/server/authentication.js',
    'src/server/handlers.js',
    'src/server/quick-response.js',
    'src/server/server.js',
    'src/server/static-resources.js'
  ],
  [ 'src/util/prompt.js', 'src/util/safeWriteFile.js' ],
  'src/util.js'
]
1

Nếu bạn chỉ quan tâm đến các tệp có tiện ích mở rộng cụ thể (như .html được đề cập trong câu hỏi), bạn có thể lọc chúng bằng cách sử dụng

files.flat(Number.POSITIVE_INFINITY)
3:

[
  [
    'src/client/api.js',
    'src/client/http-constants.js',
    'src/client/index.html',
    'src/client/index.js',
    [ 'src/client/res/favicon.ico' ],
    'src/client/storage.js'
  ],
  [ 'src/crypto/keygen.js' ],
  'src/discover.js',
  [
    'src/mutations/createNewMutation.js',
    'src/mutations/newAccount.js',
    'src/mutations/transferCredit.js',
    'src/mutations/updateApp.js'
  ],
  [
    'src/server/authentication.js',
    'src/server/handlers.js',
    'src/server/quick-response.js',
    'src/server/server.js',
    'src/server/static-resources.js'
  ],
  [ 'src/util/prompt.js', 'src/util/safeWriteFile.js' ],
  'src/util.js'
]
2

Đã trả lời ngày 11 tháng 8 năm 2021 lúc 10:05Aug 11, 2021 at 10:05

ZukuzukuZuku

80010 Huy hiệu bạc20 Huy hiệu Đồng10 silver badges20 bronze badges

Nếu bạn muốn làm việc đồng bộ với GLOB, hãy sử dụng chức năng

files.flat(Number.POSITIVE_INFINITY)
4 như được đề cập trong tài liệu của họ. Đây là ví dụ tương đương được cung cấp bởi @Paul Mougel nhưng được viết đồng bộ:

[
  [
    'src/client/api.js',
    'src/client/http-constants.js',
    'src/client/index.html',
    'src/client/index.js',
    [ 'src/client/res/favicon.ico' ],
    'src/client/storage.js'
  ],
  [ 'src/crypto/keygen.js' ],
  'src/discover.js',
  [
    'src/mutations/createNewMutation.js',
    'src/mutations/newAccount.js',
    'src/mutations/transferCredit.js',
    'src/mutations/updateApp.js'
  ],
  [
    'src/server/authentication.js',
    'src/server/handlers.js',
    'src/server/quick-response.js',
    'src/server/server.js',
    'src/server/static-resources.js'
  ],
  [ 'src/util/prompt.js', 'src/util/safeWriteFile.js' ],
  'src/util.js'
]
3

Đã trả lời ngày 1 tháng 5 năm 2021 lúc 16:56May 1, 2021 at 16:56

Bạn có thể sử dụng Loop thông qua tất cả các tệp và thư mục của thư mục gốc, nếu đó là một thư mục, sau đó vào bên trong nó và lặp lại quy trình. Xem xét mã bên dưới:

[
  [
    'src/client/api.js',
    'src/client/http-constants.js',
    'src/client/index.html',
    'src/client/index.js',
    [ 'src/client/res/favicon.ico' ],
    'src/client/storage.js'
  ],
  [ 'src/crypto/keygen.js' ],
  'src/discover.js',
  [
    'src/mutations/createNewMutation.js',
    'src/mutations/newAccount.js',
    'src/mutations/transferCredit.js',
    'src/mutations/updateApp.js'
  ],
  [
    'src/server/authentication.js',
    'src/server/handlers.js',
    'src/server/quick-response.js',
    'src/server/server.js',
    'src/server/static-resources.js'
  ],
  [ 'src/util/prompt.js', 'src/util/safeWriteFile.js' ],
  'src/util.js'
]
4

Đã trả lời ngày 16 tháng 10 năm 2020 lúc 9:32Oct 16, 2020 at 9:32

Một giải pháp với những lời hứa dựa trên Globby:

[
  [
    'src/client/api.js',
    'src/client/http-constants.js',
    'src/client/index.html',
    'src/client/index.js',
    [ 'src/client/res/favicon.ico' ],
    'src/client/storage.js'
  ],
  [ 'src/crypto/keygen.js' ],
  'src/discover.js',
  [
    'src/mutations/createNewMutation.js',
    'src/mutations/newAccount.js',
    'src/mutations/transferCredit.js',
    'src/mutations/updateApp.js'
  ],
  [
    'src/server/authentication.js',
    'src/server/handlers.js',
    'src/server/quick-response.js',
    'src/server/server.js',
    'src/server/static-resources.js'
  ],
  [ 'src/util/prompt.js', 'src/util/safeWriteFile.js' ],
  'src/util.js'
]
5

Đã trả lời ngày 23 tháng 7 năm 2021 lúc 17:11Jul 23, 2021 at 17:11

Mặc dù không hoàn hảo trong một số kịch bản, nhưng nó phải hữu ích ở nhiều người.

[
  [
    'src/client/api.js',
    'src/client/http-constants.js',
    'src/client/index.html',
    'src/client/index.js',
    [ 'src/client/res/favicon.ico' ],
    'src/client/storage.js'
  ],
  [ 'src/crypto/keygen.js' ],
  'src/discover.js',
  [
    'src/mutations/createNewMutation.js',
    'src/mutations/newAccount.js',
    'src/mutations/transferCredit.js',
    'src/mutations/updateApp.js'
  ],
  [
    'src/server/authentication.js',
    'src/server/handlers.js',
    'src/server/quick-response.js',
    'src/server/server.js',
    'src/server/static-resources.js'
  ],
  [ 'src/util/prompt.js', 'src/util/safeWriteFile.js' ],
  'src/util.js'
]
6

Đã trả lời ngày 12 tháng 2 lúc 11:19Feb 12 at 11:19

Dưới đây là một hàm thuần túy nhỏ gọn trả về tất cả các đường dẫn (người thân) trong thư mục.

[
  [
    'src/client/api.js',
    'src/client/http-constants.js',
    'src/client/index.html',
    'src/client/index.js',
    [ 'src/client/res/favicon.ico' ],
    'src/client/storage.js'
  ],
  [ 'src/crypto/keygen.js' ],
  'src/discover.js',
  [
    'src/mutations/createNewMutation.js',
    'src/mutations/newAccount.js',
    'src/mutations/transferCredit.js',
    'src/mutations/updateApp.js'
  ],
  [
    'src/server/authentication.js',
    'src/server/handlers.js',
    'src/server/quick-response.js',
    'src/server/server.js',
    'src/server/static-resources.js'
  ],
  [ 'src/util/prompt.js', 'src/util/safeWriteFile.js' ],
  'src/util.js'
]
7

Đã trả lời ngày 17 tháng 6 năm 2021 lúc 13:07Jun 17, 2021 at 13:07

2

Tôi đã làm của tôi với TypeScript hoạt động khá dễ hiểu

[
  [
    'src/client/api.js',
    'src/client/http-constants.js',
    'src/client/index.html',
    'src/client/index.js',
    [ 'src/client/res/favicon.ico' ],
    'src/client/storage.js'
  ],
  [ 'src/crypto/keygen.js' ],
  'src/discover.js',
  [
    'src/mutations/createNewMutation.js',
    'src/mutations/newAccount.js',
    'src/mutations/transferCredit.js',
    'src/mutations/updateApp.js'
  ],
  [
    'src/server/authentication.js',
    'src/server/handlers.js',
    'src/server/quick-response.js',
    'src/server/server.js',
    'src/server/static-resources.js'
  ],
  [ 'src/util/prompt.js', 'src/util/safeWriteFile.js' ],
  'src/util.js'
]
8

Đã trả lời ngày 3 tháng 11 năm 2018 lúc 17:11Nov 3, 2018 at 17:11

1