0

先に幅優先深さ優先(?)検索を使用してファイルとフォルダをマップしています。また、マップされたデータを記録し、フォルダとそのファイル/詳細を示すJSON構造を構築します。再帰的なツリートラバースを中止して後で続ける

任意のポイントで実行を停止し、JSONデータを保存してから、実行を再開し、中止した場所から続行したいとします。ここに私のコードがあります(これはGoogle Apps Script、本質的にクラウドで実行される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などの保存には手伝ってもらえません。私はそれを停止した後に再帰的なツリーのトラバースを続ける方法を理解し、私が中断したところからデータ構造にアイテムを追加し続けるのを助ける必要があります。

+0

したがって、 'SaveCurrentState(構造体、親、パス)'行はこれの重要な部分ですか? –

+0

特にありません。私はJSONと現在のパスを保存するだけです。実際の問題は、再帰的な途中でツリー全体を再び通過することなく、どのように再起動するかについてです。 –

+0

再帰関数呼び出しの代わりにできることは、まだ訪れていない親ノードのリストを持つ配列からスタックを作成することです。途中であなたのアレイにそれらを押して、途中でそれらを飛び出させてください。 – HardScale

答えて

0

AFAIKいいえJavaScriptランタイムは、あなたに求めていることをする必要があるコールスタックを操作するための低レベルのアクセスを提供します。

あなたの最良の賭けはあなた自身のスタックを使い、再帰を一切スキップすることです。それはあなたがそれをしているときに再帰的に行うことができますが、ループとスタックを使って繰り返し実行することができ、ループの状態を保存して再開する方がはるかに簡単であるため、予約注文tree traversalを行っているようです実行呼び出しスタック。