A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 金肖 中级黑马   /  2012-5-5 19:17  /  3134 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

File类中如何删除一个带内容的目录(包括子目录中的内容)?

5 个回复

倒序浏览
public static void deleteDir(File dir) {
  if (dir == null || !dir.exists() || !dir.isDirectory())
  return; // 检查参数
  for (File file : dir.listFiles()) {
  if (file.isFile())
  file.delete(); // 删除所有文件
  else if (file.isDirectory())
  deleteDir(file); // 递规的方式删除文件夹
  }
  dir.delete();// 删除目录本身
  }
  需要注意的是,如果删除的文件中包含有系统正在使用的文件时,文件不会被删除掉,不过也不会发生错误,只是将可以删除的文件全部删除了。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
在java中没有直接删除非空目录的方法,所以要自己编写方法来删除,代码很简单:
public void deleteDir(File dir)

for (File file : dir.listFiles():)

if (file.isFile())
file.delete(); // 删除所有文件
else if (file.isDirectory())
deleteDir(file);

dir.delete();// 删除目录本身
} 需要注意的是,如果删除的文件中包含有系统正在使用的文件时,文件不会被删除掉。 另外通过调用:deleteDir(new File(System.getProperty("java.io.tmpdir")));可以删除系统的临时文件
回复 使用道具 举报
自己写的,关键是使用递归,判断是否是文件夹
  1. public class DelDirs {

  2.         /**
  3.          * 删除多级目录
  4.          * 思路:创建主目录对象
  5.          * 对目录进行展开,如果目录中还有目录使用递归(调用本方法)来最终获得文件
  6.          */
  7.         public static void main(String[] args) {
  8.                 File f = new File("d:\\da");
  9.                 del(f);
  10.         }

  11.         public static void del(File dir) {
  12.                 File[] files = dir.listFiles(); //展开目录下文件及文件夹
  13.                 for(int x = 0;x<files.length;x++){ //遍历所有文件和文件夹
  14.                         if(files[x].isDirectory()){  //如果是文件夹的话递归
  15.                                 del(files[x]);  //使用递归找出最底级目录
  16.                         }
  17.                 }
  18.                 dir.delete();
  19.         }

  20. }
复制代码
回复 使用道具 举报
递归虽然简单效率却很低,
我就来个深度优先搜素删除文件的非递归实现吧,主要靠栈技术

直接上代码了:
import java.io.File;
import java.util.Stack;

public class Test
{
        public static void main(String[] args)
        {
          File f=new File("c:\\test"); //任意一个File(文件或是文件夹)
          deleteDir(f);
        }
        public static void deleteDir(File dir)
        {
          if(dir == null || (!dir.isDirectory() && !dir.isFile())) //如果为空或者非法直接返回
          {
                  return;
          }
          if(dir.isFile())//如果传入的是文件便直接删除返回
          {
                  dir.delete();
                  return;
          }
          Stack<File> list = new Stack<File>(); //定义栈,注意这个栈只存储文件夹(目录)不存储文件
          list.push(dir);
          while(!list.isEmpty())  //只要栈非空,就继续
          {
              File file = list.peek();  //获取栈顶元素(一定为文件夹(目录)),不弹出
              if(file.listFiles().length == 0)  //如果这个目录为空,则直接从栈定弹出并删除 然后继续循环
              {
                      list.pop();
                      file.delete();
                      continue;
              }
              for(File file2:file.listFiles()) //否则迭代这个目录
              {
                  if(file2.isFile())  //如果是文件直接删除不压栈
                     file2.delete();
                   else
                           list.push(file2);//如果是目录则压栈
              }
          }
        }

}

哦了

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 很给力!学习了

查看全部评分

回复 使用道具 举报
徐慧书 发表于 2012-5-5 21:11
递归虽然简单效率却很低,
我就来个深度优先搜素删除文件的非递归实现吧,主要靠栈技术

哥们确实很给力,我也学习了。赞
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马