在学习java.io.File时,做了一件事无聊的事,用此类的mkdirs()方法创建一个包含99个文件夹的文件夹。
public static void file100(){
String pathStr ="";
for(int i = 0; i < 100 ; i++)
pathStr += "/就是删不掉我";
pathStr = "C:" + pathStr;
File file = new File(pathStr);
file.mkdirs();
}
但随之也出了个问题,我发现在删除它时系统告诉我文件名称过长无法删除,有点头大。想了想,试试用代码来删,看看如何。经过几经改进之后有了如下代码:
public static void deleteFile(File file) {
File[] fileList;
if (file.isDirectory() && (fileList = file.listFiles()).length > 0)
for (int i = 0; i < fileList.length; i++)
deleteFile(fileList[i]);
file.delete();
}
思路很简单,向前递归到自己是一个文件或空文件夹时把自己删除,与此同时自己的上层文件夹也就变成了空文件夹(当然此文件或文件夹的同级文件或文件夹也把自己删除了),在此时也就可以把自己删除了。
一直觉得树形目录看起来很酷,一天突然来了兴致,干脆自己也做一个得了,经过思索和调整有了如下代码:
public static void fileTreeInjection(File file, final int indent,
String upBranch, StringBuilder strBuff) {
File[] fileList;
try {
if (file.isDirectory() && (fileList = file.listFiles()).length > 0) {
for (int i = 0; i < indent; i++)
upBranch = upBranch + " ";
upBranch = upBranch + "|";
String upBranchCopy = upBranch;
for (int i = 0; i < indent; i++)
upBranch = upBranch + "-";
for (int i = 0; i < fileList.length; i++) {
if (i == fileList.length - 1)
upBranchCopy = upBranchCopy.substring(0, upBranchCopy.length() - 1) + " ";
strBuff.append(upBranch + fileList[i].getName() + "\n");
fileTreeInjection(fileList[i], indent, upBranchCopy, strBuff);
}
}
} catch (NullPointerException e) {}
}
fille:你要输出的文件 indent:缩进的数量 upBranch:上层及上上层的枝干部分 strBuff:目录字符的缓冲区
原理和文件删除类似,只不过这里是文件名的输出,再者就是多了一点枝干显示排列方面的字符处理。
还有就是那个空指针异常的捕获,说明一下。这个异常一般在输出指定盘符下的文件目录时会抛出。唉...不知道算不算JDK的一个漏洞,在判断一个文件为文件夹时,如果此文件夹为空,正常调用listFiles()得到的File[]对象应为一个长度为零的数组,而在上面的情况下可能会遇到一个类似文件名为System Volume Information的一个系统隐藏文件,它在调用listFiles()得到的File[]对象为null,有点郁闷。这个文件输出也无太大意义,索性不做处理。
最后的效果如下图: