private HierarchicalNode FindStep(HierarchicalNode current, int index, string path, int position, int last, int spaces, Func <HierarchicalNodeToken, HierarchicalNode> onStep) { var part = path.Substring(last, position - last - spaces); HierarchicalNode parent = null; switch (part) { case "": case ".": return(current); case "..": if (current._parent != null) { current = current._parent; } break; default: parent = current; current = parent.GetChild(part); break; } if (onStep != null) { current = onStep(new HierarchicalNodeToken(index, part, current, parent)); } return(current); }
internal HierarchicalNodeToken(string name, HierarchicalNode current, HierarchicalNode parent = null) { this.Name = name; this.Current = current; this.Parent = parent ?? (current != null ? current.InnerParent : null); }
protected HierarchicalNode(string name, HierarchicalNode parent, char pathSeparatorChar = DefaultPathSeparatorChar) { if(string.IsNullOrWhiteSpace(name)) throw new ArgumentNullException("name"); if(name.Contains(pathSeparatorChar.ToString())) throw new ArgumentException("The name contains path separator char."); if(Zongsoft.Common.StringExtension.ContainsCharacters(name, @"./\*?!@#$%^&")) throw new ArgumentException("The name contains invalid character(s)."); _name = name.Trim(); _parent = parent; PathSeparatorChar = pathSeparatorChar; }
protected HierarchicalNode(string name, HierarchicalNode parent = null) { if (string.IsNullOrEmpty(name)) { throw new ArgumentNullException(nameof(name)); } if (name.IndexOfAny(IllegalCharacters) >= 0) { throw new ArgumentException("The name contains illegal character(s)."); } _name = name.Trim(); _parent = parent; }
protected HierarchicalNode(string name, HierarchicalNode parent = null, char pathSeparatorChar = '/') { if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentNullException("name"); } if (name.IndexOfAny(IllegalCharacters) >= 0) { throw new ArgumentException("The name contains illegal character(s)."); } _name = name.Trim(); _parent = parent; PathSeparatorChar = pathSeparatorChar; }
protected HierarchicalNode(string name, HierarchicalNode parent = null, char pathSeparatorChar = '/') { if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentNullException("name"); } if (name.Contains(pathSeparatorChar.ToString())) { throw new ArgumentException("The name contains path separator char."); } if (Zongsoft.Common.StringExtension.ContainsCharacters(name, @"./\*?!@#$%^&")) { throw new ArgumentException("The name contains invalid character(s)."); } _name = name.Trim(); _parent = parent; PathSeparatorChar = pathSeparatorChar; }
internal protected HierarchicalNode FindNode(string[] paths, Func <HierarchicalNodeToken, HierarchicalNode> onStep = null) { if (paths == null || paths.Length == 0) { return(null); } //确保当前子节点集合已经被加载过 this.EnsureChildren(); //当前节点默认为本节点 var current = this; //如果第一个部分是空字符则表示路径是以斜杠(/)打头或第一个部分是以斜杠(/)打头则从根节点开始查找 if (string.IsNullOrWhiteSpace(paths[0]) || paths[0].Trim()[0] == PathSeparatorChar) { current = this.FindRoot(); } int pathIndex = 0, partIndex = 0; string[] parts = null; while (current != null && pathIndex < paths.Length) { var part = string.Empty; HierarchicalNode parent = null; if (parts == null && paths[pathIndex].Contains(PathSeparatorChar.ToString())) { parts = paths[pathIndex].Split(PathSeparatorChar); partIndex = 0; } if (parts == null) { part = paths[pathIndex++].Trim(); } else { if (partIndex < parts.Length) { part = parts[partIndex++].Trim(); } else { parts = null; pathIndex++; continue; } } switch (part) { case "": case ".": continue; case "..": current = current._parent; parent = current != null ? current._parent : null; break; default: parent = current; current = current.GetChild(part); break; } if (onStep != null) { current = onStep(new HierarchicalNodeToken(part, current, parent)); if (current == null) { return(null); } } } return(current); }