从具有指定文件夹名称的文件夹结构中获取文件名

Get the filenames from the folder structure with a specified folder name

本文关键字:文件夹 结构 文件名 获取      更新时间:2023-09-26

我正试图解决一个类似的问题,并遇到问题。Javascript递归在遍历整个树之前就完成了?

我有相同的函数listFiles,但有两个参数。第二个参数是传递给此函数的文件夹名称。该函数应该返回在传递的文件夹名下的文件名。如。如果传递的文件夹名称是'js',那么函数应该返回5个文件,即- main.js', 'app.js', 'misc.js', 'jquery.js'和'underscore.js'。这是我试图写的代码,以实现结果-

function listSubfolder(fileSystem, subFolder){
            var result = [];
            for(var i=0; i<fileSystem.files.length; i++){
                if(typeof fileSystem.files[i] !== 'string') {
                    fileSystem = fileSystem.files[i];
                    findFiles(fileSystem);
                }
            }
        function findFiles(fileSystem) {
            var files = fileSystem.files;
            if (typeof files !== 'undefined') {
                for (var i = 0; i < files.length; i++) {
                    if (typeof files[i] === 'string') {
                        result.push(files[i]);
                    } else {
                        findFiles(files[i]);
                    }
                }
            }
        }
return result;
}

这里有几个问题。首先是范围。

将参数fileSystem传递给函数(L1):

function listSubfolder(fileSystem, subFolder){

但是你在函数(L5)中重新定义它:

fileSystem = fileSystem.files[i];

同样的事情也发生在您的findFiles函数(L10)上。您再次指定fileSystem(这不会从listSubFolder中破坏原始fileSystem对象,但将来可能会导致错误),所以我也会重命名该参数。

现在第二个问题是你需要检查文件是否来自指定的子文件夹(L4):

if(typeof fileSystem.files[i] !== 'string' && fileSystem.files[i].dir === subFolder) {

最终的编辑应该是这样的:

function listSubfolder(fileSystem, subFolder){
    var result = [], 
        fArr;
    for(var i=0; i<fileSystem.files.length; i++){
        if(typeof fileSystem.files[i] !== 'string' && fileSystem.files[i].dir === subFolder) {
            fArr = fileSystem.files[i];
            findFiles(fArr);
        }
    }
    function findFiles(f) {
        var files = f.files;
        if (typeof files !== 'undefined') {
            for (var i = 0; i < files.length; i++) {
                if (typeof files[i] === 'string') {
                    result.push(files[i]);
                } else {
                    findFiles(files[i]);
                }
            }
        }
    }
    return result;
}

您提供的代码的主要问题是,您没有检查当前文件夹,看看您是否在subFolder内。您可以向findFiles方法添加一个额外的布尔参数,该方法跟踪您是否在指定的子文件夹中。只有在这种情况下,才应该将文件添加到result

在您的第一个循环中也有一个bug,您在每次循环中都更改fileSystem。你可以删除这个循环,让findFiles像处理其他目录一样处理根目录。

function listSubfolder(fileSystem, subFolder){
  var result = [];
  function findFiles(fileSystem, inSubFolder) {
    var files = fileSystem.files;
    if (typeof files !== 'undefined') {
      for (var i = 0; i < files.length; i++) {
        if (typeof files[i] === 'string') {
          if (inSubFolder) {
            result.push(files[i]);
          }
        } else {
          var currentInSubFolder = (files[i].dir === subFolder);
          findFiles(files[i], inSubFolder || currentInSubFolder);
        }
      }
    }
  }
  findFiles(fileSystem, false);
  return result;
}