Skip to content

Instantly share code, notes, and snippets.

@SOULPWRD
Last active February 22, 2021 07:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SOULPWRD/310dba4fc81f6b71bbbd950526afb802 to your computer and use it in GitHub Desktop.
Save SOULPWRD/310dba4fc81f6b71bbbd950526afb802 to your computer and use it in GitHub Desktop.
The example of the asynchronous recursive directory traversal
// The example of the asynchronous recursive directory traversal
// Copyright (c) 2021 Martin Pravda
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// The Software shall be used for Good, not Evil.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
/*property
freeze, isDirectory, isFile, length, lstat, map, push, readdir, replace,
shift
*/
import fs from "fs";
// find the ending slash at the end of the string value
const slash_rx = /\/$/g;
function readdir(callback, dir_path) {
fs.readdir(
dir_path,
function (err, files) {
if (err) {
callback(undefined, err);
return;
}
callback(files);
}
);
}
function lstat(callback, path) {
fs.lstat(
path,
function (err, stats) {
if (err) {
callback(undefined, err);
return;
}
callback(stats);
}
);
}
function readdir_recursively(callback, path) {
path = path.replace(slash_rx, "");
const files_queue = [path];
const results = [];
function walk(path) {
if (files_queue.length === 0) {
callback(results);
return;
}
files_queue.shift();
lstat(
function (stats, err) {
if (err) {
callback(undefined, err);
return;
}
if (stats.isFile() === true) {
results.push(path);
walk(files_queue[0]);
}
if (stats.isDirectory() === true) {
readdir(
function (files, err) {
if (err) {
callback(undefined, err);
return;
}
files = files.map(
function (file_name) {
return path + "/" + file_name;
}
);
files_queue.push(...files);
walk(files_queue[0]);
},
path
);
}
},
path
);
}
walk(files_queue[0]);
}
export default Object.freeze(readdir_recursively);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment