递归计算指定目录下的文件及文件总个数,并封装为ztree对象数据

最近参与的项目要求将指定目录下的文件及文件个数通过递归算法计算出来,并封装转换为前端ztree格式对象显示结果。后台主要逻辑实现,提供数据和数据模型,前端转换封装需要的对象数据格式。部分代码下面贴出来,仅供参考,请多指正!

一、controller代码:

    List<ZtreeNodeVo> xml = new ArrayList<ZtreeNodeVo>();
    xml = this.taskDesignService.getJobTree("admin");// json数据格式的作业及作业目录
    String obj = JSON.toJSONString(xml);

二、service部分实现逻辑代码

 /**
     * 递归获取指定目录下的文件夹和文件
     * @param path
     */
    public List<ZtreeNodeVo>  getJobTree(String userId){
        List<ZtreeNodeVo> nodes = new ArrayList<ZtreeNodeVo> ();
            baseDir = new File(baseDir,userId);
            if(baseDir.listFiles().length!=0){
                ZtreeNodeVo node =traverse(baseDir,null);
                nodes.add(node);
            }
        return nodes;
    }
    private ZtreeNodeVo traverse(File file,String flag){
        ZtreeNodeVo pathNodeVo = new ZtreeNodeVo();
        pathNodeVo.setId(file.getAbsolutePath());
        pathNodeVo.setEname(file.getName());
        pathNodeVo.setPid(file.getParent());
        pathNodeVo.setName(getNameByKey(file.getName()));
        if(file.isDirectory()){
            if(flag==null){
                pathNodeVo.setIconFlag("0");
                pathNodeVo.setPid("-1");
            }else if(flag.equals("0")){
                pathNodeVo.setIconFlag("1");
            }else{
                pathNodeVo.setIconFlag("2");
            }
            pathNodeVo.setParent(true);
            List<ZtreeNodeVo>  subNodeVos = new ArrayList<ZtreeNodeVo>();
            int size=0;
            File[] subFiles = file.listFiles();
            for(File subFile:subFiles){
                ZtreeNodeVo subNodeVo = traverse(subFile,filefilter,pathNodeVo.getIconFlag());
                if(subNodeVo!=null){
                    subNodeVos.add(subNodeVo);
                    size+=subNodeVo.getSize();
                }
            }
            pathNodeVo.setChildren(subNodeVos);
            pathNodeVo.setSize(size);
        }else{
            pathNodeVo.setParent(false);
            pathNodeVo.setSize(1);
            pathNodeVo.setIconFlag("3");
        }
        return pathNodeVo;
    }

三、vo类

public class ZtreeNodeVo {
	private String id;
	private String pid;
	private String name;
	private String Ename;
	private boolean parent;
	private String iconFlag;// 0:admin目录,1:工程目录,2:普通目录,3:叶子节点
	private int size;
	private List<ZtreeNodeVo> children;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPid() {
		return pid;
	}
	public void setPid(String pid) {
		this.pid = pid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public int getSize() {
		return size;
	}
	public void setSize(int size) {
		this.size = size;
	}
	
	public List<ZtreeNodeVo> getChildren() {
		return children;
	}
	public void setChildren(List<ZtreeNodeVo> children) {
		this.children = children;
	}
	public String getEname() {
		return Ename;
	}
	public void setEname(String ename) {
		Ename = ename;
	}
	
	public boolean isParent() {
		return parent;
	}
	public void setParent(boolean parent) {
		this.parent = parent;
	}
	public String getIconFlag() {
		return iconFlag;
	}
	public void setIconFlag(String iconFlag) {
		this.iconFlag = iconFlag;
	}
	
	
}

四、前端接收数据并封装转换

$.ajax({
        url: '', //url 
        data: {},
        async: false,
        type: 'GET',
        dataType: "json", //可以是text,如果用text,返回的结果为字符串;如果需要json格式的,可是设置为json
        ContentType: "application/json; charset=utf-8",
        success: function(data) {
        	//console.log(data);
        	$.each(data,function(){
        		var treeNode = traverse(this);
        		treeNode.name = treeNode.name+" ("+treeNode.size+")";
        		if(treeNode.parent){
        			treeNode.isParent=true;
    			}else{
    				treeNode.isParent=false;
    			}
        		if(treeNode.iconFlag=='0'){
        			treeNode.icon='style/zTree_v3-master/css/zTreeStyle/img/diy/fat-user.png';
    			}
        		treeNodes.push(treeNode);
        	});
            $.fn.zTree.init($("#taskTree"), setting, treeNodes);
            zTree=$.fn.zTree.getZTreeObj("taskTree");
        },
        error: function(msg) {
            alert("目录加载失败!");
        }
    });
}
function traverse(obj){
	var childs = obj.children;
	if(childs && childs.length>0){
		for(var i=0;i<childs.length;i++){
			var node = traverse(childs[i]);
			if(node.parent){
				node.name=node.name+" ("+node.size+")";
				node.isParent=true;
			}else{
				node.isParent=false;
			}
			if(node.iconFlag=='1'){
				node.iconOpen='style/zTree_v3-master/css/zTreeStyle/img/diy/1_open.png';
				node.iconClose='style/zTree_v3-master/css/zTreeStyle/img/diy/1_close.png';
			}else if(node.iconFlag=='2'){
				node.iconOpen="style/zTree_v3-master/css/zTreeStyle/img/diy/ztree-01.png";
				node.iconClose="style/zTree_v3-master/css/zTreeStyle/img/diy/ztree-02.png";
			}else{
				node.icon='style/zTree_v3-master/css/zTreeStyle/img/diy/ztree-03.png';
			}
		}
	}
	return obj;
}
五、结果显示:


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 可以这样实现:function getDirTree(dir) { // 获取文件列表 let filesList = fs.readdirSync(dir); let dirTree = []; // 遍历文件列表 filesList.forEach((item) => { let stat = fs.statSync(path.join(dir, item)); // 判断是文件夹还是文件 if (stat.isDirectory()) { // 递归调用 dirTree.push({ name: item, type: 'directory', children: getDirTree(path.join(dir, item)) }); } else { dirTree.push({ name: item, type: 'file' }); } }); return dirTree; } ### 回答2: 编写一个JS方法,递归文件夹下的目录文件,并返回树形结构数据的思路如下: 1. 定义一个对象,用于表示树形结构的节点: ``` function TreeNode(name, type, children) { this.name = name; // 节点名称 this.type = type; // 节点类型(文件目录) this.children = children; // 子节点 } ``` 2. 定义一个递归函数,用于遍历文件夹下的目录文件,并返回树形结构数据: ``` function generateTreeStructure(path) { // 获取当前路径下的所有文件目录 const files = getFilesInPath(path); // 构建根节点 const root = new TreeNode(path, '目录', []); // 遍历文件目录递归生成子节点 for (const file of files) { if (isDirectory(file)) { // 如果是目录 const childNode = generateTreeStructure(file); root.children.push(childNode); } else { // 如果是文件 const fileNode = new TreeNode(file, '文件', []); root.children.push(fileNode); } } return root; } ``` 3. 定义两个辅助函数: - `getFilesInPath(path)`:根据传入的路径,返回当前路径下的所有文件目录。 - `isDirectory(path)`:根据传入的路径,判断该路径是否为目录。 4. 调用该方法,传入想要遍历的文件夹路径,即可返回树形结构数据: ``` const treeStructure = generateTreeStructure('/path/to/folder'); ``` 注意:以上代码只是伪代码,具体实现还需要根据实际需求进行适配。 ### 回答3: 编写一个JS方法,递归文件夹下的目录文件,并返回树形结构数据可以使用以下方法: ```javascript function getFolderStructure(folderPath) { const fs = require('fs'); const path = require('path'); const root = { name: path.basename(folderPath), children: [] }; function traverseFolder(folder, node) { const items = fs.readdirSync(folder); items.forEach(item => { const itemPath = path.join(folder, item); const stats = fs.statSync(itemPath); const newItem = { name: item, type: stats.isFile() ? 'file' : 'folder', children: [] }; if (stats.isDirectory()) { traverseFolder(itemPath, newItem); } node.children.push(newItem); }); } traverseFolder(folderPath, root); return root; } // 示例调用 const folderStructure = getFolderStructure('/path/to/folder'); console.log(JSON.stringify(folderStructure, null, 2)); ``` 以上代码会遍历指定路径下的所有文件夹和文件,并返回树形结构的数据。树的根节点包含文件夹的名称和一个子节点数组。每个子节点包含文件或子文件夹的名称、类型(文件文件夹)以及它自己的子节点数组。最后将此树形结构数据以JSON字符串的形式打印出来。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值