Unity 獲取指定路徑文件夾下所有文件集合(遞歸寫法)(一)


寫法模板:

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;
        }

    }

 

歡迎各位指正交流,如有興趣的可以把這個寫法提取為代碼模板

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM