forked from ZECTBynmo/file-finder
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfile-finder.js
155 lines (133 loc) · 5 KB
/
file-finder.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
"use strict";
//////////////////////////////////////////////////////////////////////////
// file-finder - Main module
//////////////////////////////////////////////////////////////////////////
//
//
/* ----------------------------------------------------------------------
Object Structures
-------------------------------------------------------------------------
*/
var FileFinder = {};
//////////////////////////////////////////////////////////////////////////
// Node.js Exports
if (exports != undefined)
FileFinder = exports;
//////////////////////////////////////////////////////////////////////////
// Namespace (lol)
var DEBUG = false;
var log = function (text) {
if (DEBUG) console.log(text);
}
var fs = require('fs'),
path = require('path');
//////////////////////////////////////////////////////////////////////////
// Recursively searches a directory for files with a given string in them
FileFinder.findFiles = function (directory, searchString, options, callback) {
if (arguments.length == 3) { // if only three arguments were supplied
if (Object.prototype.toString.call(options) == "[object Function]") {
callback = options;
options = {};
}
}
log("Searching directory " + directory + " recursively");
if (searchString === undefined || searchString == "") {
log("[email protected]: Search string required")
return callback(null, {});
}
var matches = [],
searchSubDirectories = options.searchSubDirectories === undefined && true; //default to search subdirectories
// Read into the directory
fs.readdir(directory, function (err, files) {
if (err) {
return callback(err);
}
var numFilesRemaining = files.length;
if (numFilesRemaining === 0)
return callback(null, matches);
// Examine each file
files.forEach(function (file) {
file = directory + '/' + file;
fs.stat(file, function (err, stat) {
if (stat && stat.isDirectory() && searchSubDirectories) {
FileFinder.findFiles(file, searchString, options, function (err, res) {
matches = matches.concat(res);
numFilesRemaining -= 1;
if (numFilesRemaining === 0)
callback(null, matches);
});
} else {
// Push this file into our results if it contiains the substring
if (file.indexOf(searchString) != -1)
matches.push(file);
numFilesRemaining -= 1;
if (numFilesRemaining === 0)
callback(null, matches);
}
});
});
});
}; // end FileFinder.findFiles()
//////////////////////////////////////////////////////////////////////////
// Recursively searches a directory for files with a given string in them
FileFinder.findFilesStats = function (directory, searchString, options, callback) {
if (arguments.length == 3) { // if only three arguments were supplied
if (Object.prototype.toString.call(options) == "[object Function]") {
callback = options;
options = {};
}
}
FileFinder.findFiles(directory, searchString, options, function (err, results) {
if (err) {
callback(err, null);
} else {
populateFileStats(results, callback);
}
});
};
function populateFileStats(filesList, callback) {
//if no files found, we need to return no data.
if (!filesList){
return callback(null, null);
}
var itemCount = filesList.length;
var fileInfoList = [];
if (itemCount === 0) {
return callback(null, filesList);
}
filesList.forEach(function (file) {
fs.stat(file, function (err, stats) {
if (err) {
callback(err, null);
}
fileInfoList.push({fullName: file,
dirName: path.dirname(file),
baseName: path.basename(file),
ext: path.extname(file),
dev: stats.dev,
ino: stats.ino,
mode: stats.mode,
nlink: stats.nlink,
uid: stats.uid,
gid: stats.gid,
rdev: stats.rdev,
size: stats.size,
blksize: stats.blksize,
block: stats.blocks,
atime: stats.atime,
mtime: stats.mtime,
ctime: stats.mtime,
isFile: stats.isFile(),
isDirectory: stats.isDirectory(),
isBlockDevice: stats.isBlockDevice(),
isCharacterDevice: stats.isCharacterDevice(),
isFIFO: stats.isFIFO(),
isSocket: stats.isSocket()
});
itemCount -= 1;
if (itemCount === 0) {
callback(null, fileInfoList);
}
});
});
}