经常写代码,应该能遇到这样一个问题,需要用java删除某个文件夹,如果文件夹下面有子文件夹或文件,可能子文件夹下面还有文件或者文件夹的话,这样直接是删不掉的,什么意思呢,我查遍java file的api,当文件夹下面还存在文件时,并没有直接提供方法删除。为了省事,刚才随便百度了一个,代码比较长,由于我需要删除的子文件夹中存在以“.”开头的文件,于是并不能删除。最后静下来自己写了一个,总共代码就十行左右,但是和一般人的思路都不太一样。
private void deleteFile(String fileName){ File file = new File(fileName); if(file.exists()){ file.delete(); } if(file.exists()){ String[] paths = file.list(); for(String str:paths){ deleteFile(fileName+"\\"+str); } file.delete(); } }
这样确实解决了问题,但是细想下,里面还是有些问题的,java不让删除有子文件的文件夹,估计也是为了安全考虑,没有任何提示,一旦删除,那就真没了。那我们来稍微修改下代码:
private void deleteFile(String fileName,boolean isForceDelete){ File file = new File(fileName); if(file.exists()){ file.delete(); } if(file.exists()){ if(!isForceDelete){ return; } String[] paths = file.list(); for(String str:paths){ deleteFile(fileName+"\\"+str,isForceDelete); } file.delete(); } }
传这样一个参数,是否强制删除,如果文件夹下面还是文件夹,那就不删除,只要传一个boolean型的参数false就解决了问题。
看到这,本以为解决了问题,其实还没有,你知道递归的执行效率很低,并且对资源的占用情况随着任务规模的扩大,对资源的占用将呈几何式增长么,你想一下,如果目标文件夹下面存在大量的层级比较深的文件和文件夹时,这时候的执行效率是比较低的,而且很占资源。一旦你选择了递归算法,我觉得执行效率没啥改变了,但是资源占用方面可以有所改变,因此可以从这方面考虑下。这时候不用疑惑,java的GC线程虽然是实时的在检测着,但是一旦系统规模大了,难免有些照应不过了,因此有些垃圾对象可能会删除的有点迟,这里可以查一下,gc回收垃圾的机制有一种是查询对象是否还有被引用,一旦没有被引用,则立即启用回收,准备回收,于是我们可以稍微再改下代码:
private void deleteFile(String fileName,boolean isForceDelete){ File file = new File(fileName); if(file.exists()){ file.delete(); } if(file.exists()){ if(!isForceDelete){ return; } String[] paths = file.list(); for(String str:paths){ deleteFile(fileName+"\\"+str,isForceDelete); } file.delete(); paths = null; // lets gc do its works } file = null; // lets gc do its works }
这样问题应该彻底解决了,虽然我也只是一名菜鸟,但是平时就应该用这样的标准要求自己,平时多研究下,随着经验的积累,总一天别人也会叫你"大牛"、"*哥",至于lets gc do its works 这样的注释写法源于java 源码,java源码都是开放的,建议大家没事多研究下java源码,里面有很多经典的代码。
相关推荐
### Java删除文件夹知识点详解 #### 一、背景与需求分析 在开发过程中,经常会遇到需要清理临时文件或旧版本项目文件的需求。特别是在Windows系统下,如果文件路径过长,可能会遇到无法直接通过操作系统界面删除的...
为了完全复制包括所有层级的文件夹,你需要在`copyDirectiory`方法中递归地处理每一个子文件夹,确保所有嵌套的文件和子文件夹都被处理。 在实际应用中,可能还需要添加错误处理、权限检查、覆盖确认等额外功能。...
在Java编程中,复制文件夹是一项常见的任务,特别是在处理数据迁移、备份或程序部署时。以下将详细讲解如何使用Java实现文件夹的复制。 首先,我们需要理解文件和文件夹的基本操作。在Java中,`java.io`包提供了...
在Java编程中,对比文件夹和文件是一项常见的需求,尤其在文档管理和版本控制中。本篇文章将探讨如何使用Java实现这一功能,特别是针对word、pdf、文本和图片等类型的文件进行对比计算,以及如何计算文本的相似率和...
在这个完整的Java IO整理版中,我们将深入探讨一些基本的IO概念和用法,主要包括文件操作、路径分隔符、文件删除、文件夹创建以及列出目录下的所有文件。 首先,创建新文件是Java IO中最基础的操作之一。在案例1中...
在IT行业中,尤其是在Java开发领域,访问网络上的共享文件夹是一项常见的任务。有时,我们可能需要从一个系统读取或写入另一个系统上的文件,这时就需要利用特定的库来实现。"smbj.jar"是一个专门用于处理SMB...
首先,Java中的`File`类是操作文件和目录的基础,它提供了许多方法来创建、删除、重命名文件以及检查文件属性。在案例1中,通过`new File("D:\\hello.txt")`创建了一个`File`对象,然后调用`createNewFile()`方法...
MinIO是基于Apache 2.0许可的开源对象存储服务器,它与Amazon S3 API兼容,因此可以轻松地集成到Java应用中。本项目是一个基于SpringBoot的小型Java应用程序,展示了如何利用MinIO进行一系列操作,如创建bucket、...
1. **文件名对比**:这是最基础的对比,检查两个文件夹内的文件名是否完全相同。如果有任何文件名不匹配,那么这两个文件夹就不相同。 2. **文件大小对比**:如果文件名相同,我们需要进一步比较文件的大小。文件...
通过《疯狂JAVA讲义(第2版)》的学习,读者不仅可以掌握Java编程语言,还能了解和实践软件开发的完整过程,从而成为一名合格的Java开发者。光盘中的代码资源则是学习过程中不可或缺的辅助工具,帮助读者从理论走向...
Java文件夹复制功能是通过编程实现的,主要涉及到文件操作和网络通信两个核心知识点。这里有两个关键类:`FileSelection` 和 `BackupClient`。`FileSelection` 类用于选择和组织待复制的文件,而 `BackupClient` 类...
这个压缩包文件"完整版近在眼前-检测文件夹是否存在(大全)两种方法.rar"似乎提供了两种不同的方法来实现这一功能。下面,我们将详细讨论这两种方法。 方法一:使用操作系统命令 在Windows操作系统中,我们可以...
- `rm` 是删除文件的命令,使用 `rm [文件名]` 来删除文件。 - `mv` 是移动或重命名文件的命令,如 `mv [旧文件名] [新文件名]`。 - `cd` 是改变目录的命令,例如 `cd /home/user` 可以切换到 `/home/user` 目录。 ...
Java中删除文件或目录可以使用`java.io.File`类的方法。具体来说,我们可以使用`delete()`方法来删除单个文件,但要注意的是,如果该文件是一个目录,`delete()`方法只会成功删除空目录。为了删除整个目录树,我们...
9. **编程接口**:在编程中,经常需要编写代码来选择或操作文件夹,如使用Python的os模块或Java的File类。 10. **权限与安全**:选择文件夹时,需注意权限设置,防止未经授权的访问或修改。 总之,选择文件夹这一...
总的来说,Java版本的Eclipse在Mac平台上提供了完整的开发环境,结合其丰富的插件和强大的社区支持,为开发者提供了高效、便捷的开发体验。无论你是初学者还是经验丰富的开发者,Eclipse都是一个值得信赖的选择。
这个压缩包文件"完整版近在眼前-检测文件夹是否存在(大全)两种方法.e.rar"似乎包含了一个详细指南,讲述了如何检查特定文件夹是否存在于指定路径中。我们将探讨这两种方法,并深入理解它们的工作原理和应用场景。...
例如,在Python中,我们可以使用`os`和`os.path`模块,而在Java中则可以使用`java.io.File`类。 **Python示例** 在Python中,可以使用以下代码来遍历文件夹并打印目录树结构: ```python import os def list_...
这个压缩包文件"完整版近在眼前-检测文件夹是否存在(大全)4中方法.rar"显然包含了四种不同的方法来实现这一功能。以下是这四种方法的详细说明: 1. **命令行检查**: 在命令行环境下,无论是Windows的CMD还是...
SVNKit是一个完全由Java编写的Subversion客户端库,它允许开发者在Java应用程序中直接访问Subversion服务器而无需安装其他额外的客户端程序。这使得开发者能够更灵活地集成SVN功能到自己的项目中。 #### SVNUtil类...