先に幅優先深さ優先(?)検索を使用してファイルとフォルダをマップしています。また、マップされたデータを記録し、フォルダとそのファイル/詳細を示す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などの保存には手伝ってもらえません。私はそれを停止した後に再帰的なツリーのトラバースを続ける方法を理解し、私が中断したところからデータ構造にアイテムを追加し続けるのを助ける必要があります。
したがって、 'SaveCurrentState(構造体、親、パス)'行はこれの重要な部分ですか? –
特にありません。私はJSONと現在のパスを保存するだけです。実際の問題は、再帰的な途中でツリー全体を再び通過することなく、どのように再起動するかについてです。 –
再帰関数呼び出しの代わりにできることは、まだ訪れていない親ノードのリストを持つ配列からスタックを作成することです。途中であなたのアレイにそれらを押して、途中でそれらを飛び出させてください。 – HardScale