public Dictionary <string, MegaDirectoryNode> GetMegaNodes() { if (_megaNodes == null) { //DateTime start = DateTime.Now; //IEnumerable<INode> nodes = _client.GetNodes(); IEnumerable <INode> nodes = _GetNodes(); //TimeSpan time = DateTime.Now - start; //Trace.WriteLine($"MegaClient.GetMegaNodes_v2() : _client.GetNodes() time {time}"); //start = DateTime.Now; // Dictionary : one node by directory, key is mega id Dictionary <string, MegaDirectoryNode> megaNodes1 = GetMegaNodes1(nodes); //time = DateTime.Now - start; //Trace.WriteLine($"MegaClient.GetMegaNodes_v2() : GetDictionaryNodes1_v2() time {time}"); //Trace.WriteLine($"MegaClient.GetMegaNodes_v2() : GetDictionaryNodes1_v2() megaNodes.Count {megaNodes1.Count} nodeCount {_nodeCount} _directoryNodeCount {_directoryNodeCount} _fileNodeCount {_fileNodeCount} nodeWithUnknowParent {_dictionaryNodes1_nodeWithUnknowParent} nodeAlreadyCreated {_dictionaryNodes1_nodeAlreadyCreated}"); //start = DateTime.Now; // Dictionary : one node by directory, key is directory path _megaNodes = new Dictionary <string, MegaDirectoryNode>(); MegaDirectoryNode root = new MegaDirectoryNode { Path = "/" }; root.Childs.Add(_root); root.Childs.Add(_inbox); root.Childs.Add(_trash); _megaNodes.Add("/", root); // browse tree directory nodes //foreach (MegaDirectoryNode_v2 node in BrowseDirectoryNodes(megaNodes1)) foreach (MegaNode node in BrowseNodes(megaNodes1)) { string path = null; if (node.Parent != null) { path = node.Parent.Path; } //path += "/" + node.GetName(); path += "/" + node.Name; node.Path = path; if (node.Node.Type != NodeType.File) { _megaNodes.Add(path, (MegaDirectoryNode)node); } } //time = DateTime.Now - start; //Trace.WriteLine($"MegaClient.GetMegaNodes_v2() : create _megaNodes_v2 time {time}"); } return(_megaNodes); }
// not used //private IEnumerable<MegaDirectoryNode_v2> BrowseDirectoryNodes(Dictionary<string, MegaDirectoryNode_v2> megaNodes) //{ // Stack<IEnumerator<MegaNode_v2>> stack = new Stack<IEnumerator<MegaNode_v2>>(); // foreach (MegaDirectoryNode_v2 rootNode in new MegaDirectoryNode_v2[] { _root, _inbox, _trash }) // { // yield return rootNode; // IEnumerator<MegaNode_v2> enumerator = rootNode.Childs.GetEnumerator(); // stack.Push(enumerator); // while (true) // { // if (enumerator.MoveNext()) // { // MegaNode_v2 node = enumerator.Current; // //yield return node; // if (node.Node.Type == NodeType.Directory) // { // MegaDirectoryNode_v2 directoryNode = (MegaDirectoryNode_v2)node; // yield return directoryNode; // enumerator = directoryNode.Childs.GetEnumerator(); // stack.Push(enumerator); // } // } // else // { // stack.Pop(); // if (stack.Count == 0) // break; // enumerator = stack.Peek(); // } // } // } //} private IEnumerable <MegaNode> BrowseNodes(Dictionary <string, MegaDirectoryNode> megaNodes) { Stack <IEnumerator <MegaNode> > stack = new Stack <IEnumerator <MegaNode> >(); foreach (MegaDirectoryNode rootNode in new MegaDirectoryNode[] { _root, _inbox, _trash }) { yield return(rootNode); IEnumerator <MegaNode> enumerator = rootNode.Childs.GetEnumerator(); stack.Push(enumerator); while (true) { if (enumerator.MoveNext()) { MegaNode node = enumerator.Current; yield return(node); if (node.Node.Type == NodeType.Directory) { MegaDirectoryNode directoryNode = (MegaDirectoryNode)node; //yield return directoryNode; enumerator = directoryNode.Childs.GetEnumerator(); stack.Push(enumerator); } } else { stack.Pop(); if (stack.Count == 0) { break; } enumerator = stack.Peek(); } } } }
private Dictionary <string, MegaDirectoryNode> GetMegaNodes1(IEnumerable <INode> nodes) { // Dictionary : one node by directory, key is mega id Dictionary <string, MegaDirectoryNode> megaNodes = new Dictionary <string, MegaDirectoryNode>(); _dictionaryNodes1_nodeWithUnknowParent = 0; _dictionaryNodes1_nodeAlreadyCreated = 0; _nodeCount = 0; _fileNodeCount = 0; _directoryNodeCount = 0; foreach (INode node in nodes) { _nodeCount++; //if (type == NodeType.Root) // _root = node; //else if (type == NodeType.Inbox) // _inbox = node; //else if (type == NodeType.Trash) // _trash = node; // MegaNode_v2 : Id, Node, Path, Childs MegaDirectoryNode parentMegaNode = null; string parentId = node.ParentId; if (parentId != null && parentId != "") { if (!megaNodes.TryGetValue(parentId, out parentMegaNode)) { _dictionaryNodes1_nodeWithUnknowParent++; parentMegaNode = new MegaDirectoryNode { Id = parentId }; megaNodes.Add(parentId, parentMegaNode); //Trace.WriteLine($"nodeWithUnknowParent : Id {node.Id} Name {node.Name}"); } } MegaNode megaNode; NodeType type = node.Type; if (type != NodeType.File) { string id = node.Id; MegaDirectoryNode megaDirectoryNode; if (!megaNodes.TryGetValue(id, out megaDirectoryNode)) { megaDirectoryNode = new MegaDirectoryNode { Id = id, Node = node, Name = GetName(node) }; megaNodes.Add(id, megaDirectoryNode); } else { _dictionaryNodes1_nodeAlreadyCreated++; if (megaDirectoryNode.Node != null) { throw new PBException($"node should be null"); } megaDirectoryNode.Node = node; megaDirectoryNode.Name = GetName(node); //Trace.WriteLine($"nodeAlreadyCreated : Id {node.Id} Name {node.Name}"); } if (type == NodeType.Root) { _root = megaDirectoryNode; } else if (type == NodeType.Inbox) { _inbox = megaDirectoryNode; } else if (type == NodeType.Trash) { _trash = megaDirectoryNode; } megaNode = megaDirectoryNode; if (type == NodeType.Directory) { _directoryNodeCount++; } } else { megaNode = new MegaNode { Id = node.Id, Node = node, Name = GetName(node) }; _fileNodeCount++; } if (parentMegaNode != null) { megaNode.Parent = parentMegaNode; parentMegaNode.Childs.Add(megaNode); } } return(megaNodes); }