信手拈来 妙手偶得 » 日志 » [原创]目录树的建立,遍历及批量删除
[原创]目录树的建立,遍历及批量删除
Junglesong 发表于 2007-12-08 12:16:57
文件和目录的基类:
文件类,继承自FileBase:
目录类,继承自FileBase,可容纳多个文件或目录:
调用过程:
输出:
代码下载:
http://www.blogjava.net/Files/sitinspring/FolderFileAdv20071203212111.rar
同类的另一代码:
http://www.blogjava.net/Files/sitinspring/EnterpriseManageAdv20071203215316.rar
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;
}
}
/**
* 文件和目录的基类
* @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
* @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);
}
}
}
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("");
}
}
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/
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
曾经的这一天...
- » 2005年: 【转贴】The Mass<魔界传奇>
相关日志:
- » 办外国企业常驻代表机构
- » 我来了
- » 欢迎光临非常之名的blog!
- » 建 立 自 信 的方 法
- » 【转贴】对一个算法笔试题的注解
收藏:
QQ书签
del.icio.us
订阅:
Google
抓虾
