public void Act_On_All_Actionable_Folders(string parentdirectory, Recursion_Rule_Enum recursion_rule, Folder_Actionable_Delegate folder_actionable_method, Folder_Action_Delegate folder_action_method) { // Create the root node Recursive_Folder_TreeNode parentNode = new Recursive_Folder_TreeNode(parentdirectory); if (!folder_actionable_method(parentdirectory)) { parentNode.isActionable = false; } // Step through each subdirectory recursively string[] subdirs = System.IO.Directory.GetDirectories(parentdirectory); foreach (string thisSubDir in subdirs) { recursively_check_children(thisSubDir, parentNode, recursion_rule, folder_actionable_method); } // Post-order traverse the build tree and each actionable directory List <Recursive_Folder_TreeNode> postOrderNodes = new List <Recursive_Folder_TreeNode>(); recursively_post_order_traverse_tree(parentNode, postOrderNodes); // Step through and act on each directory foreach (Recursive_Folder_TreeNode actionNode in postOrderNodes) { try { folder_action_method(actionNode.Directory); } catch (Exception e) { } } }
private void recursively_check_children(string directory, Recursive_Folder_TreeNode parentNode, Recursion_Rule_Enum recursion_rule, Folder_Actionable_Delegate folder_actionable_method) { // Is this folder actionable bool node_is_actionable = true; if (!folder_actionable_method(directory)) { // Does this rule out any parents? if (recursion_rule == Recursion_Rule_Enum.Parents_Of_Unactionable_Folder_Are_Unactionable) { // If not, then none of its parents can be actioned parentNode.isActionable = false; while ((parentNode.Parent_Node != null) && (parentNode.Parent_Node.isActionable)) { parentNode = parentNode.Parent_Node; parentNode.isActionable = false; } } // Also, this node can't be actioned (but maybe some children can) node_is_actionable = false; } // Can the children still be actionable? if ((recursion_rule != Recursion_Rule_Enum.Children_Of_Unactionable_Folder_Are_Unactionable) || (node_is_actionable)) { // Add this node to the tree and check its children Recursive_Folder_TreeNode childNode = new Recursive_Folder_TreeNode(directory, node_is_actionable); childNode.Parent_Node = parentNode; parentNode.Child_Nodes.Add(childNode); // Step through each subdirectory recursively string[] subdirs = System.IO.Directory.GetDirectories(directory); foreach (string thisSubDir in subdirs) { recursively_check_children(thisSubDir, childNode, recursion_rule, folder_actionable_method); } } }