在基本目录数组中递归查找子目录

bobbyrne01

出于测试目的,我试图记录3个基本目录中包含多少个(子)目录,但是结果没有意义。
linux控制台输出与插件输出,子目录数不匹配,例如

console.log: recursive: 7
console.info: recursive: time taken =  38ms
console.log: recursive: 7
console.info: recursive: time taken =  41ms
console.log: recursive: 35
console.info: recursive: time taken =  330ms
Total time: 7.571605 seconds
Program terminated successfully.
rob@work:~/git/recursiveDirListingFF$ find /home/rob/Pictures/ -mindepth 1 -type d | wc -l
1
rob@work:~/git/recursiveDirListingFF$ find /home/rob/Music/ -mindepth 1 -type d | wc -l
2
rob@work:~/git/recursiveDirListingFF$ find /home/rob/Downloads/ -mindepth 1 -type d | wc -l
37

任何人都可以提出建议,这可能是什么问题?
这是代码,main.js..

var myBaseDirs = [];

myBaseDirs.push('/home/rob/Pictures');
myBaseDirs.push('/home/rob/Music');
myBaseDirs.push('/home/rob/Downloads');

require("./FileIO").list(myBaseDirs);

FileIO.js ..

var {
        Cu
    } = require("chrome"),
    {
        OS
    } = Cu.import("resource://gre/modules/osfile.jsm", {});

function compare(a, b) {
    if (a.filename < b.filename)
        return -1;
    if (a.filename > b.filename)
        return 1;
    return 0;
}

exports.list = function (dirs) {

    var audio = [],
        dirsTemp = [],
        checkedSubdirI = dirs.length - 1,
        sTime = new Date().getTime(),
        eTime = 0;

    for (var w = 0; w < dirs.length; w++) {
        dirsTemp.push(dirs[w]);
    }

    for (var k = 0; k < dirsTemp.length; k++) {

        let iterator = new OS.File.DirectoryIterator(dirsTemp[k]);

        var promise = iterator.forEach(
            function onEntry(entry) {
                if (entry.isDir) {
                    dirsTemp.push(entry);
                }
            }
        );

        var onSuc = function onSuccess() {
            iterator.close();
            if (checkedSubdirI === dirsTemp.length - 1) {
                eTime = new Date().getTime();
                console.log(dirsTemp.length);
                console.info('time taken = ', eTime - sTime + 'ms');
                return dirsTemp;
            } else {
                checkedSubdirI++;
                iterator = new OS.File.DirectoryIterator(dirsTemp[checkedSubdirI].path);
                promise = iterator.forEach(
                    function onEntry(entry) {
                        if (entry.isDir) {
                            dirsTemp.push(entry);
                        }
                    }
                );
                return promise.then(
                    onSuc,
                    onRej
                );
            }
        }

        var onRej = function onFailure(reason) {
                iterator.close();
                eTime = new Date().getTime();
                console.info('FAILED reason = ', reason, 'time taken = ', eTime - sTime + 'ms');
                throw reason;
            }
            // Finally, close the iterator
        promise.then(
            onSuc,
            onRej
        );
    }
};
bobbyrne01

这被证明是有用的:

https://developer.mozilla.org/zh-CN/docs/Mozilla/JavaScript_code_modules/OSFile.jsm/OS.File.DirectoryIterator_for_the_main_thread#Example.3A_Iterating_through_all_child_entries_of_directory

//start - helper function
    function enumChildEntries(pathToDir, delegate, max_depth, runDelegateOnRoot, depth) {
    // IMPORTANT: as dev calling this functiopn `depth` arg must ALWAYS be null/undefined (dont even set it to 0). this arg is meant for internal use for iteration
    // `delegate` is required
    // pathToDir is required, it is string
    // max_depth should be set to null/undefined/<0 if you want to enumerate till every last bit is enumerated. paths will be iterated to including max_depth.
    // if runDelegateOnRoot, then delegate runs on the root path with depth arg of -1
    // this function iterates all elements at depth i, then after all done then it iterates all at depth i + 1, and then so on
    // if arg of `runDelegateOnRoot` is true then minimum depth is -1 (and is of the root), otherwise min depth starts at 0, contents of root

    var deferred_enumChildEntries = new Deferred();
    var promise_enumChildEntries = deferred_enumChildEntries.promise;

    if (depth === undefined || depth === undefined) {
        // at root pathDir
        depth = 0;
        if (runDelegateOnRoot) {
            var entry = {
                isDir: true,
                name: OS.Path.basename(pathToDir),
                path: pathToDir
            };
            var rez_delegate = delegate(entry, -1);
            if (rez_delegate) {
                deferred_enumChildEntries.resolve(entry);
                return promise_enumChildEntries; // to break out of this func, as if i dont break here it will go on to iterate through this dir
            }
        }
    } else {
        depth++;
    }

    if ((max_depth === null || max_depth === undefined) || ( depth <= max_depth)) {
        var iterrator = new OS.File.DirectoryIterator(pathToDir);
        var subdirs = [];
        var promise_batch = iterrator.nextBatch();
        promise_batch.then(
            function(aVal) {
                for (var i = 0; i < aVal.length; i++) {
                    if (aVal[i].isDir) {
                        subdirs.push(aVal[i]);
                    }
                    var rez_delegate_on_root = delegate(aVal[i], depth);
                    if (rez_delegate_on_root) {
                        deferred_enumChildEntries.resolve(aVal[i]);
                        return promise_enumChildEntries; //to break out of this if loop i cant use break, because it will get into the subdir digging, so it will not see the `return promise_enumChildEntries` after this if block so i have to return promise_enumChildEntries here
                    }
                }
                // finished running delegate on all items at this depth and delegate never returned true

                if (subdirs.length > 0) {
                    var promiseArr_itrSubdirs = [];
                    for (var i = 0; i < subdirs.length; i++) {
                        promiseArr_itrSubdirs.push(enumChildEntries(subdirs[i].path, delegate, max_depth, null, depth)); //the runDelegateOnRoot arg doesnt matter here anymore as depth arg is specified
                    }
                    var promiseAll_itrSubdirs = Promise.all(promiseArr_itrSubdirs);
                    promiseAll_itrSubdirs.then(
                        function(aVal) {
                            deferred_enumChildEntries.resolve('done iterating all - including subdirs iteration is done - in pathToDir of: ' + pathToDir);
                        },
                        function(aReason) {
                            var rejObj = {
                                promiseName: 'promiseAll_itrSubdirs',
                                aReason: aReason,
                                aExtra: 'meaning finished iterating all entries INCLUDING subitering subdirs in dir of pathToDir',
                                pathToDir: pathToDir
                            };
                            deferred_enumChildEntries.reject(rejObj);
                        }
                    ).catch(
                        function(aCaught) {
                            throw aCaught; //throw here as its not final catch
                        }
                    );
                } else {
                    deferred_enumChildEntries.resolve('done iterating all - no subdirs - in pathToDir of: ' + pathToDir);
                }
            },
            function(aReason) {
                var rejObj = {
                    promiseName: 'promise_batch',
                    aReason: aReason
                };
                if (aReason.winLastError == 2) {
                    rejObj.probableReason = 'targetPath dir doesnt exist';
                }
                deferred_enumChildEntries.reject(rejObj);
            }
        ).catch(
            function(aCaught) {
                throw aCaught;
            }
        );
    } else {
        deferred_enumChildEntries.resolve('max depth exceeded, so will not do it, at pathToDir of: ' + pathToDir);
    }

    return promise_enumChildEntries;
}
// end - helper function

/************ start usage **************/
    var totalEntriesEnummed = 0; //meaning total number of entries ran delegate on, includes root dir
var allPaths = [];
function delegate_handleEntry(entry) {
  // return true to make enumeration stop
  totalEntriesEnummed++;
  allPaths.push(entry.path);
  console.info('entry:', entry);
}

var pathToTarget = OS.Constants.Path.desktopDir;
var promise_enumEntries = enumChildEntries(pathToTarget, delegate_handleEntry, null /* get all files */, false);
promise_enumEntries.then(
  function(aVal) {
    console.log('Fullfilled - promise_enumEntries - ', aVal, 'allPaths:', allPaths);
    console.info('totalEntriesEnummed:', totalEntriesEnummed)
  },
  function(aReason) {
    console.error('Rejected - promise_enumEntries - ', aReason);
  }
).catch(
  function(aCatch) {
    console.error('Caught - promise_enumEntries - ', aCatch);
  }  
);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在子目录中递归移动文件

来自分类Dev

Mac:如何递归地在子目录中查找最大的文件(忽略所有目录)

来自分类Dev

在子目录中查找文件

来自分类Dev

递归展平根目录中的子目录并维护1级子目录结构

来自分类Dev

递归子目录grep

来自分类Dev

Makefile子目录递归

来自分类Dev

git-在子目录中查找目录

来自分类Dev

查找目录及其子目录中的所有文件

来自分类Dev

在父目录而不是子目录中查找搜索

来自分类Dev

使用macOS终端在子目录中查找目录

来自分类Dev

BeautifulSoup查找子目录

来自分类Dev

使用-prune选项时如何在子目录中查找递归

来自分类Dev

如何在 Makefile 的子目录中递归查找源文件?

来自分类Dev

监视目录以查找新的子目录

来自分类Dev

查找不包含子目录的目录

来自分类Dev

优化子目录中的递归文件搜索速度?

来自分类Dev

在Ruby递归副本中包含空子目录

来自分类Dev

在空子目录中递归创建空文件

来自分类Dev

递归地将根目录中的子目录展平并保持一级子目录结构

来自分类Dev

在Python中更改的子目录中查找文件

来自分类Dev

递归查找目录,但不显示匹配项的子目录

来自分类Dev

子目录中的cakePHP

来自分类Dev

提示中的子目录?

来自分类Dev

子目录中的测试

来自分类Dev

子目录中的cakePHP

来自分类Dev

子目录中的文件?

来自分类Dev

如何告诉RequireJS在某些模块的子目录中查找?

来自分类Dev

使Rails在子目录中查找.mobile文件?

来自分类Dev

在几个子目录中查找特定文件