1. 程式人生 > >遞迴計算指定目錄下的檔案及檔案總個數,並封裝為ztree物件資料

遞迴計算指定目錄下的檔案及檔案總個數,並封裝為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;
}
五、結果顯示: