繁体   English   中英

停止并随后继续进行递归树遍历

[英]Stopping and later continuing a recursive tree traversal

我正在使用广度优先深度优先(?)搜索来映射文件和文件夹。 我还将记录映射的数据,并构建一个显示文件夹及其文件/详细信息的JSON结构。

我想在任意点暂停执行,保存JSON数据,然后重新启动执行,并从我中断的地方继续执行。 这是我的代码(这是Google Apps脚本,本质上是美化了云计算的JavaScript)。

function MapDrive() {      
  var structure = {};
  try {    
    var parentFolder = DriveApp.getRootFolder();

    getChildFolders(parentFolder, structure, {path: parentFolder.getName()});
    var blob = CreateJSONBlob(structure);
    MailApp.sendEmail('myEmail', 'Folder Tree', 'Drive Map Attached' ,{ attachments: [blob]})
  } catch (e) {
    Logger.log(e.toString());   
  }
}

//Recursive breadth-first folder and file mapping
function TraverseDriveTree(parent, structure, path){
  if(CheckExecutionTime()){
    var childFolders = parent.getFolders();
    var parentName = parent.getName(); 

    //If there is no parent path add it
    if(typeof path[parentName] === 'undefined'){
      path[parentName] = {path: path.path};
    }

    //If parent doe snot exist in structure, then add it and it's files
    if(typeof structure[parentName] === 'undefined'){
      structure[parentName] = {};
      structure[parentName]['files'] = GetFilesInfo(parent.getFiles(), path[parentName].path);
    }  

    while (childFolders.hasNext()) {    
      var childFolder = childFolders.next();
      var childfolderName = childFolder.getName();  
      path[parentName][childfolderName] = {path: path[parentName].path + " > " +childfolderName};

      if(typeof structure[parentName][childfolderName] === 'undefined'){
        structure[parentName][childfolderName] = {};
      }

      structure[parentName][childfolderName]["files"] = GetFilesInfo(childFolder.getFiles(), path[parentName][childfolderName].path);

      // Recursive call for any sub-folders
      TraverseDriveTree(childFolder, structure[parentName][childfolderName], path[parentName]);    
    }     

  } else {
    SaveCurrentState(structure, parent, path)
  }
}

我不需要有关保存JSON或类似内容的帮助。 我需要帮助,弄清楚如何在停止递归树遍历后继续它,并继续从我停下来的地方向数据结构添加项。

AFAIK no JavaScript运行时为您提供了一种低级访问权限来操纵您需要执行的调用堆栈。

最好的选择是使用自己的堆栈,并完全跳过递归。 看起来您正在执行顺序树遍历 ,可以在执行过程中以递归方式进行遍历 ,但是也可以使用循环和堆栈来迭代地进行遍历 ,这比保存和恢复循环状态要容易得多。用于执行调用堆栈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM