[原创]目录树的建立,遍历及批量删除

Junglesong 发表于 2007-12-08 12:16:57

文件和目录的基类:
package com.sitinspring;

/**
 * 文件和目录的基类
 * 
@author: sitinspring
 * @date: 2007-12-3
 
*/
public abstract class FileBase {
    
// 名称
    protected String name;

    
// 所在目录
    protected Folder currFolder;

    
// 递归时缩进使用
    protected static final String TAB = "    ";

    
public FileBase(String name) {
        
this.name = name;
    }

    
// 抽象方法,打印本身信息及子元素信息,强制子类使用
    public abstract void printInfo(String tabs);

    
// 取得本身的绝对路径,递归调用上级目录,直到找到根目录为止
    public String getPath() {
        StringBuffer sb 
= new StringBuffer();

        
// 目录指针,初始化时指向当前目录
        Folder folderPointer = currFolder;
        
        
if(folderPointer==null){
            
return "根目录";
        }

        
// 如目录指针不指向空,即未到顶层目录,则继续向上回溯
        while (folderPointer != null) {
            
// 取得的目录名放置在前方
            sb.insert(0, folderPointer.name + "/");
            
            
// 继续向上回溯
            folderPointer = folderPointer.currFolder;
        }

        
// 返回绝对路径
        return sb.toString();
    }

    
public Folder getCurrFolder() {
        
return currFolder;
    }

    
public void setCurrentFolder(Folder folder) {
        
this.currFolder = folder;
    }

    
public String getName() {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }
}

文件类,继承自FileBase:
package com.sitinspring;

/**
 * 文件类,继承自FileBase
 * 
@author: sitinspring
 * @date: 2007-12-3
 
*/
public class File extends FileBase{    
    
// 文件大小
    private int size;
    
    
public File(String name,int size){
        
super(name);
        
this.size=size;
    }
    
    
// 打印文件信息
    public void printInfo(String tabs){
        System.out.println(tabs
+" Filename="+name+" size="+size+" path="+getPath());
    }

    
public int getSize() {
        
return size;
    }

    
public void setSize(int size) {
        
this.size = size;
    }    
}

目录类,继承自FileBase,可容纳多个文件或目录:
package com.sitinspring;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 目录类,继承自FileBase,可容纳多个文件或目录
 * 
 * 
@author: sitinspring
 * @date: 2007-12-3
 
*/
public class Folder extends FileBase {
    
// 文件和目录的容器
    private List<FileBase> fileSystems;

    
public Folder(String name) {
        
super(name);
    }

    
// 删除容器中的文件和目录
    public void remove(FileBase fileSystem) {
        fileSystems.remove(fileSystem);
    }

    
// 添加文件或目录到容器中
    public void add(FileBase fileSystem) {
        
if (fileSystems == null) {
            fileSystems 
= new ArrayList<FileBase>();
        }

        fileSystems.add(fileSystem);

        
// 设置添加元素的当前目录
        fileSystem.setCurrentFolder(this);
    }

    
/**
     * 查找空的文件或目录,将结果放置到emptyItems中
     * 
     * 
@param emptyItems
     
*/
    
public void findEmptyFile(List<FileBase> emptyItems) {
        
// 对空目录进行检查,以防空指针异常发生
        if (fileSystems == null) {
            
return;
        }

        
// 遍历查找
        for (FileBase fileSystem : fileSystems) {
            
if (fileSystem instanceof Folder) {
                
// 找到目录
                Folder folder = (Folder) fileSystem;

                
/**
                 * 如果folder.fileSystems == null,则add函数从来没有被调用过,其下必无文件
                 * 如果folder.fileSystems.size()==0,则添加的文件或目录都被删除了 两者满足一个就说明目录下无文件
                 
*/
                
if (folder.fileSystems == null
                        
|| folder.fileSystems.size() == 0) {
                    
// 如果目录下无文件或目录则加入链表emptyItems
                    emptyItems.add(folder);
                } 
else {
                    
// 有子目录则继续向下递归遍历
                    folder.findEmptyFile(emptyItems);
                }

            } 
else {
                
// 找到文件,如果文件大小为空则加入链表emptyItems
                File file = (File) fileSystem;

                
if (file.getSize() == 0) {
                    emptyItems.add(file);
                }
            }
        }
    }
    
    
/**
     * 查找空的文件或目录,将结果直接删除
     * 
     * 
@param emptyItems
     
*/
    
public void removeEmptyFile() {
        
// 对空目录进行检查,以防空指针异常发生
        if (fileSystems == null) {
            
return;
        }

        
// 遍历查找
        for (Iterator it=fileSystems.iterator();it.hasNext();){
            FileBase fileSystem
=(FileBase)it.next();
            
            
if (fileSystem instanceof Folder) {
                
// 找到目录
                Folder folder = (Folder) fileSystem;

                
/**
                 * 如果folder.fileSystems == null,则add函数从来没有被调用过,其下必无文件
                 * 如果folder.fileSystems.size()==0,则添加的文件或目录都被删除了 两者满足一个就说明目录下无文件
                 
*/
                
if (folder.fileSystems == null
                        
|| folder.fileSystems.size() == 0) {
                    
// 如果目录下无文件或目录则加入链表emptyItems
                    it.remove();
                } 
else {
                    
// 有子目录则继续向下递归遍历
                    folder.removeEmptyFile();
                }

            } 
else {
                
// 找到文件,如果文件大小为空则加入链表emptyItems
                File file = (File) fileSystem;

                
if (file.getSize() == 0) {
                    it.remove();
                }
            }
        }
    }

    
/**
     * 打印目录信息
     
*/
    
public void printInfo(String tabs) {
        
// 输出本身的名字
        System.out.println(tabs + " Foldername=" + name + " path=" + getPath());

        
// 对空目录进行检查,以防空指针异常发生
        if (fileSystems == null) {
            
return;
        }

        
// 将容器中的文件目录信息也打印出来
        for (FileBase fileSystem : fileSystems) {
            
// tabs + TAB是让下到一层目录就缩进一次
            fileSystem.printInfo(tabs + TAB);
        }
    }
}


调用过程:
package com.sitinspring;

import java.util.ArrayList;
import java.util.List;

/**
 * 程序入口
 * 
@author: sitinspring
 * @date: 2007-12-3
 
*/
public class Main{
    
public static void main(String[] args){
        
//------------------建立目录结构-----------------------
        File file7=new File("7",0);
        File file6
=new File("6",10);
        Folder folder4
=new Folder("4");
        folder4.add(file6);
        folder4.add(file7);
        
        folder4.add(
new Folder("5"));
        
        File file5
=new File("5",10);
        File file4
=new File("4",10);
        Folder folder3
=new Folder("3");
        folder3.add(file4);
        folder3.add(file5);
        folder3.add(folder4);        
        
        File file2
=new File("2",0);
        File file1
=new File("1",10);
        Folder folder2
=new Folder("2");
        folder2.add(file1);
        folder2.add(file2);
        
        Folder folder1
=new Folder("1");
        folder1.add(folder2);
        folder1.add(folder3);
                
        
        Folder folder0
=new Folder("0");
        folder0.add(folder1);
        
        System.out.println(
"//-----------打印整颗目录树-----------");
        folder0.printInfo(
"");        
        
        
// 找出空的目录和文件
        List<FileBase> emptyItems=new ArrayList<FileBase>();
        folder0.findEmptyFile(emptyItems);
        
        
// 方法一:将空文件目录从其所在目录删除
        for(FileBase fileSystem:emptyItems){
            System.out.println(
"空目录名或文件名为"+fileSystem.getName());
            Folder folder
=fileSystem.getCurrFolder();
            folder.remove(fileSystem);            
        }
        
        
// 方法二:两个方法选择一个执行
        folder0.removeEmptyFile();
        
        System.out.println(
"//-----------打印删除空文件和目录后的目录树-----------");
        folder0.printInfo(
"");
    }    
}


输出:

//-----------打印整颗目录树-----------
 Foldername=0 path=根目录
     Foldername
=1 path=0/
         Foldername
=2 path=0/1/
             Filename
=1 size=10 path=0/1/2/
             Filename
=2 size=0 path=0/1/2/
         Foldername
=3 path=0/1/
             Filename
=4 size=10 path=0/1/3/
             Filename
=5 size=10 path=0/1/3/
             Foldername
=4 path=0/1/3/
                 Filename
=6 size=10 path=0/1/3/4/
                 Filename
=7 size=0 path=0/1/3/4/
                 Foldername
=5 path=0/1/3/4/
空目录名或文件名为2
空目录名或文件名为7
空目录名或文件名为5
//-----------打印删除空文件和目录后的目录树-----------
 Foldername=0 path=根目录
     Foldername
=1 path=0/
         Foldername
=2 path=0/1/
             Filename
=1 size=10 path=0/1/2/
         Foldername
=3 path=0/1/
             Filename
=4 size=10 path=0/1/3/
             Filename
=5 size=10 path=0/1/3/
             Foldername
=4 path=0/1/3/
                 Filename
=6 size=10 path=0/1/3/4/

代码下载:
http://www.blogjava.net/Files/sitinspring/FolderFileAdv20071203212111.rar

同类的另一代码:
http://www.blogjava.net/Files/sitinspring/EnterpriseManageAdv20071203215316.rar

曾经的这一天...


收藏: QQ书签 del.icio.us 订阅: Google 抓虾

最新评论

发表评论

* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 
 

分类小组论坛
杂谈, 娱乐、八卦, 文学、艺术, 体育, 旅游、同城, 象牙塔, 情感, 时尚、生活, 星座, 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定