Java删除文件或目录及目录下所有文件

一直在做C++相关开发的工作。突然某一天一时兴起,想学习下Java开发。然后再网上找到一本Java简明教程,入门是够用了。看到文件IO这一章,想起之前用C++做的删除文件或目录的练习,于是打算用Java来实现这个功能。本以为很简单的功能,还是遇到一些问题。仔细分析下代码,定位到出问题的地方。在此处记录下,提醒自己不会重蹈覆辙。

1. 第一版的删除函数是这样写的

 1 static boolean delFile(String filename) {
 2         File file = new File(filename);
 3         if (!file.exists()) {
 4             return false;
 5         }
 6
 7         if (file.isFile()) {
 8             return file.delete();
 9         } else {
10             String[] filenames = file.list();
11             for (String f : filenames) {
12                 delFile(f);
13             }
14             return file.delete();
15         }
16     }

代码能编译过,但是运行结果并不符合预期结果。如果在一个大型系统,出现这样的问题,往往是一件很头疼的小事。我的做法是,遇到自己不熟悉的,先自己建一个小工程实现这一功能,添加测试用例。如果测试通过,才会移植到大系统上去。

经过仔细分析,上面的代码出问题的地方是第10行,file.list()返回的结果是当前路径下的所有文件的文件名,并不包含路径。所以递归调用时,因为检测文件不存在,而返回。然后就有下面这一版。

2. 正确的删除文件或目录方法

 1 static boolean delFile(File file) {
 2         if (!file.exists()) {
 3             return false;
 4         }
 5
 6         if (file.isFile()) {
 7             return file.delete();
 8         } else {
 9             File[] files = file.listFiles();
10             for (File f : files) {
11                 delFile(f);
12             }
13             return file.delete();
14         }
15     }

这版的代码直接以文件对象File为参数,file.listFiles()返回的也是自文件的File对象集合。File对象保存了该文件的具体位置,因此不会出现上一版出现的问题,这一版能正常的工作。

代码虽然能正常工作,但不是最简洁的版本。下面有一个更为简洁的版本。

3. 简单并能正常工作的版本

 1 static boolean delFile(File file) {
 2         if (!file.exists()) {
 3             return false;
 4         }
 5
 6         if (file.isDirectory()) {
 7             File[] files = file.listFiles();
 8             for (File f : files) {
 9                 delFile(f);
10             }
11         }
12         return file.delete();
13     }

同样可以正常工作,但是代码没有重复的。

原文地址:https://www.cnblogs.com/zhugaopeng/p/9416857.html

时间: 2024-10-11 14:15:51

Java删除文件或目录及目录下所有文件的相关文章

Java 遍历指定目录及子目录下的文件

/** * 遍历指定目录及子目录下的文件 * * @author testcs_dn * @date 2014年12月12日下午2:33:49 * @param file 要遍历的指定目录 * @param collector 符合条件的结果添加到此List<File>中 * @param pathInclude 路径中包含指定的字符串 * @param fileNameInclude 文件名(不包含扩展名)中包含指定的字符串 * @param extnEquals 文件扩展名为指定字符串 *

虚拟机中如何Linux系统如何访问PC硬盘中的文件(如何将windows下的文件夹挂载到linux虚拟机下)

这段时间决定学习嵌入式,变打算安装个Linux系统先熟悉一下Linux系统的使用,但自己电脑上安装的win7系统又不想装双系统,一是闲麻烦,二是由于对Linux系统不熟悉担心会因为自己的误操作而损坏系统.所以决定安装一个虚拟机,简单粗暴,要是系统不小心死了直接关掉重启便是.但是现实往往是,很多事情表面上看起来很简单,实际上暗藏了很多问题.其中问题之一就是想在Linux上安装软件,但安装包在自己电脑的硬盘上,而在虚拟机中完全不知道怎么访问硬盘中的文件,所以就各种上网找资料,试过一些网上的方法但都貌

java打印出某一指定路径下的文件夹内的所有子文件夹和文件,并区分开来

public class printoutFile { public static void main(String[] args) { printFile(new File("D:\\test"),1); } public static void printFile(File file,int sub) { if (file.isFile()) { System.out.println("您给定的是一个文件"); // 判断给定目录是否是一个合法的目录,如果不是,

Java web 项目读取src或者tomcat下class文件夹下的xml文件或者properties文件

//生成一个文件对象: File file = new File(getClass().getClassLoader().getResource("test.xml").getPath()); //直接得到一个输入流: InputStream in = getClass().getClassLoader().getResourceAsStream("test.xml"); //在当前线程获取--这种方法不大稳定 //String path = Thread.curr

Linux下创建文件和文件夹的方法-老男孩Linux运维学习笔记2

我们可以在Linux里面通过多个命令来创建文件: touch命令创建文件: -创建单个文件: [[email protected] oldboy]# touch oldboy [[email protected] oldboy]# ll 总用量 0 4325378 -rw-r--r-- 1 root root 0 2017-05-27 13:30 oldboy -创建多个文件: [[email protected] oldboy]# touch oldboy1 oldboy2 oldboy3 

java移动文件夹、 慎用java file.renameTo(f)方法 、 java从一个目录复制文件到另一个目录下 、 java代码完成删除文件、文件夹 、

java移动文件夹(包含子文件和子文件夹): http://blog.csdn.net/yongh701/article/details/45070353 慎用java    file.renameTo(f)方法: http://www.cnblogs.com/mrwangblog/p/3934506.html 注意看结果,从C盘到E盘失败了,从C盘到D盘成功了.因为我的电脑C.D两个盘是NTFS格式的,而E盘是FAT32格式的.所以从C到E就是上面文章所说的"file systems"

文件上传时,上传到webapps目录下的文件会自动删除

1:文件上传时,上传到webapps目录下的文件会自动删除的原因? tomcat目录下的webapps 文件夹是部署目录,当重新部署服务,上传的文件不在部署文件的范畴内,即此时开发工具中没有上传的文件,所以上传的文件就没有了. 2:解决方法 把文件上传路径设置到webapps目录之外,可以在Tomcat目录下建立一个文件夹,如:upload 3:简单实现 html文件: <!DOCTYPE html> <html> <head> <meta charset=&qu

java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息

1.java使用Jsch实现远程操作linux服务器进行文件上传.下载,删除和显示目录信息. 参考链接:https://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html https://www.cnblogs.com/longyg/archive/2012/06/25/2561332.html https://www.cnblogs.com/qdwyg2013/p/5650764.html#top 引入jar包的maven依赖如下所示:

删除指定目录下过期文件并打印日志

肯定会遇到这样的事,有一个文件夹,每天都在生成文件,那么如何去删除那些过期的文件呢.废话不多说,直接上代码: import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.text.SimpleDateFormat; public class DeleteFileImpl { //这三个变量也可以在配置文件里面配置,但是需要用到@

JAVA之IO技术-获取指定目录下的文件夹和文件的File对象或是字符串名称。

package ioTest.io3; /* * 获取指定目录下的文件夹和文件的File对象或是字符串名称. * 也可以通过filter获取指定的文件夹或者指定类型的文件 * 这里面需要做一个总结,如何利用jdk的源码去理解不熟悉的方法的应用. */ import java.io.File; import java.io.FileFilter; import java.io.FilenameFilter; public class FileDemo2 { public static void m