1 | let fs = require("fs-extra");
|
2 | let nodepath = require('path');
|
3 | let explore = require('./explore.js');
|
4 | var mimeTypes = require('mime-types')
|
5 |
|
6 | let checkFileType = (url) => {
|
7 | return new Promise((resolve, reject) => {
|
8 | fs.stat(url, (err, stats) => {
|
9 | if (err) { reject(err); return; }
|
10 | let mime = mimeTypes.lookup(url);
|
11 |
|
12 | if (stats.isDirectory()) {
|
13 | resolve({ type: 'dir', path: url });
|
14 | } else if (stats.isFile()) {
|
15 | resolve({
|
16 | type: 'file',
|
17 | path: url,
|
18 | size: stats.size,
|
19 | mime
|
20 | });
|
21 | } else {
|
22 | resolve({
|
23 | type: 'other',
|
24 | path: url,
|
25 | size: stats.size,
|
26 | mime
|
27 | })
|
28 | }
|
29 | });
|
30 | });
|
31 | };
|
32 |
|
33 |
|
34 | let readDir = (path) => {
|
35 | return new Promise((resolve, reject) => {
|
36 | let out = [];
|
37 | fs.readdir(path, (err, dirs) => {
|
38 | if (err) {
|
39 | reject(err);
|
40 | return;
|
41 | }
|
42 | dirs.forEach((ph, ind) => {
|
43 | out.push(nodepath.join(path, ph));
|
44 | });
|
45 | resolve(out);
|
46 | })
|
47 | });
|
48 | };
|
49 |
|
50 |
|
51 |
|
52 |
|
53 | let fsReadFiles = (url, {
|
54 | filter,
|
55 | callback,
|
56 | fail,
|
57 | exclude,
|
58 | include
|
59 | }) => {
|
60 |
|
61 | return new Promise((resolve, reject) => {
|
62 |
|
63 | let exp = new explore();
|
64 | exp.setCallback(() => {
|
65 | if (typeof callback === "function") {
|
66 | callback();
|
67 | }
|
68 | })
|
69 | .setError((err) => {
|
70 |
|
71 | if (typeof fail === "function") {
|
72 | fail(err);
|
73 | }
|
74 | })
|
75 | .parse((val, lastVal) => { //lastVal是解析过的val,resolve数组就继续下一次的运行,否则开始回溯,val为当前的内容,可以为字符串等等。
|
76 | return new Promise(function(resolve, reject) {
|
77 | checkFileType(val)
|
78 | .then((data) => {
|
79 | let { type, path, size, mime } = data;
|
80 | if (url !== path) {
|
81 | if (Array.isArray(exclude)) {
|
82 | for (let val of exclude) {
|
83 |
|
84 | if ((typeof val==="string")&&(path.indexOf(val) !== -1)) {
|
85 | resolve();
|
86 | return;
|
87 | }
|
88 | else if((typeof val==="object")&&(val.test(path))){//not t reg,after
|
89 | resolve();
|
90 | return;
|
91 | }
|
92 | }
|
93 |
|
94 | }
|
95 |
|
96 | if (Array.isArray(include)) {
|
97 | for (let val of include) {
|
98 | if ((typeof val==="string")&&(path.indexOf(val) === -1)) { //empty and reture
|
99 | resolve();
|
100 | return;
|
101 | }
|
102 | else if ((typeof val === "object") && (!val.test(path))) {
|
103 | resolve();
|
104 | return;
|
105 | }
|
106 | }
|
107 | }
|
108 | }
|
109 |
|
110 | if (typeof filter === "function") {
|
111 | filter(data);
|
112 | }
|
113 |
|
114 |
|
115 | if (type === 'dir') {
|
116 | readDir(path)
|
117 | .then((arr) => {
|
118 |
|
119 | resolve(arr);
|
120 | })
|
121 | .catch((err) => {
|
122 | console.log(err);
|
123 | resolve();
|
124 | });
|
125 | } else { resolve(); }
|
126 | })
|
127 | .catch((err) => {
|
128 | resolve();
|
129 | });
|
130 |
|
131 |
|
132 |
|
133 | });
|
134 | })
|
135 | .run({
|
136 | input: url
|
137 | });
|
138 | });
|
139 |
|
140 | };
|
141 |
|
142 |
|
143 | module.exports = fsReadFiles;
|
144 |
|
145 | // fsReadFiles(nodepath.join(__dirname,'../routes')); |
\ | No newline at end of file |