寫法模板:
DirNode node = new DirNode("D:/Project/Unity2018Test/Assets"); GetDirectoryInfo("D:/Project/Unity2018Test/Assets",2,node); //模板 private void GetDirectoryInfo(string dir ,int depth,Node node) { if (depth <= 0) return; depth--; if (Directory.Exists(dir)) { string[] subDirs = Directory.GetDirectories(dir); foreach (var item in subDirs) { DirNode dirNode = new DirNode(item); node.AddSubNode(dirNode); GetDirectoryInfo(item,depth,dirNode); } string[] subFiles = Directory.GetFiles(dir); foreach (var item in subFiles) { GetDirectoryInfo(item,depth ,node); } } else if (File.Exists(dir)) { FileNode fileNode = new FileNode(dir); node.AddSubNode(fileNode); } } } public abstract class Node { public enum NodeType { Dir, File } public abstract NodeType type { get; } public List<Node> subNode = new List<Node>(); public string path; public void AddSubNode(Node node) { subNode.Add(node); } } public class FileNode : Node { public override NodeType type => NodeType.File; public FileNode(string str) { path = str; } } public class DirNode : Node { public override NodeType type => NodeType.Dir; public DirNode(string str) { path = str; } }
下面是引用的寫法---當然有需要可以提取成代碼模板
//UITreeData UI UI數據結構類 UITreeData nodeData; private void Ini() { nodeData = new UITreeData("root", -1); DirNode node = new DirNode(GameApp.Ins.cash.equipmentModelPath); defParentNode = nodeData; node.curUINode = nodeData; GetDirectoryInfo(GameApp.Ins.cash.equipmentModelPath, 5, node); } private UITreeData defParentNode = new UITreeData(); //節點類-虛函數 public abstract class Node { public enum NodeType { Dir,File } public abstract NodeType type { get; } public List<Node> subNode = new List<Node>(); public UITreeData curUINode; public DirectoryInfo parentDirInfo; public string path; public void AddSubNode(Node node) { subNode.Add(node); } } //文件節點 public class FileNode :Node { public override NodeType type => NodeType.File; public FileNode(string str) { path = str; } } //文件夾節點 public class DirNode : Node { public override NodeType type => NodeType.Dir; public DirNode(string str) { path = str; parentDirInfo = new DirectoryInfo(str); } } /// <summary> /// 遍歷算法--遞歸查找 /// </summary> /// <param name="dir">文件路徑</param> /// <param name="depth">遍歷目標層級---默認遞歸深度</param> /// <param name="node">當前根文件夾</param> private void GetDirectoryInfo(string dir, int depth, Node node) { if (depth <= 0) return; depth--; Debug.Log(node.curUINode.Name + "____aaa"); if (Directory.Exists(dir)) //判斷文件夾是否存在 { //查找文件夾 string[] subDirs = Directory.GetDirectories(dir); foreach (var item in subDirs) { DirNode dirNode = new DirNode(item); node.AddSubNode(dirNode); //添加文件夾入列表 //var info = new DirectoryInfo(item); if (dirNode.parentDirInfo.Name == "Materials" || dirNode.parentDirInfo.Name == "Textures") //判斷文件名 { continue; } var forderdata = new UITreeData(dirNode.parentDirInfo.Name); forderdata.rightMenu = forderMenu; forderdata.rightClick = OnForderRightMenu; forderdata.SetCustomData<FileData>(new FileData(false, item, null)); //設置樹形節點 node.curUINode.AddChild(forderdata); dirNode.curUINode = forderdata; Debug.Log(item + "___DirNode_111"); GetDirectoryInfo(item, depth, dirNode); //遞歸 } //查找文件 string[] subFiles = Directory.GetFiles(dir); foreach (var item in subFiles) { //Debug.Log(item); if (isSysExt(Path.GetExtension(item).ToLower())) { UITreeData childdata = new UITreeData(Path.GetFileName(item)); childdata.SetCustomData<FileData>(new FileData(false, item, null)); childdata.rightMenu = modelMenu; childdata.rightClick = OnModelRightBtn; childdata.leftClick = ShowModel; node.curUINode.AddChild(childdata); datas.Add(childdata); //添加到列表 } Debug.Log(item + "___FileNode_222"); GetDirectoryInfo(item, depth, node);//遞歸 } } else if (File.Exists(dir)) //判斷文件是存在 { FileNode fileNode = new FileNode(dir); node.AddSubNode(fileNode); //return; } }
歡迎各位指正交流,如有興趣的可以把這個寫法提取為代碼模板
