【原创】java删除未匹配的文件夹FileFileFilter,FileUtils,删除目录名字不是某个名字的所有文件夹及其子文件夹
闲着无聊,写了个小程序。
需求:
举例: 比如我的E盘有一个test的目录,test的结构如下:

要求除了包含hello的目录不删除以外,其他的所有文件夹都要删除。
代码如下:
package com.zuishiming.filedelete; import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.FileFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter; /**
* Requirement: we want to delete all dirs except a SPECIALNAME dir in one root directory. </br>
* tree data: </br>
* rootdir(c:\test) </br>
* --dir1</br>
* --dir11 </br>
* --dir12("hello") </br>
* --dir13</br>
* --dir2</br>
* --dir21</br>
* --dir211</br>
* --dir2111("hello")</br>
* --dir212</br>
* --dir22</br>
* --dir3</br>
* as this case, we want to delete c:\test dir all dirs except dir name is "hello", just bellow two dirs</br>
* c:\test\dir1\dir12 && c:\test\dir2\dir21\dir211\dir2111</br>
*
* @author 草原战狼
*
*/
public class FileDelete {
public static void main(String[] args) throws IOException {
System.out.println("FileDelete Usage:");
System.out.println("java -jar DeleteDirsAddFilter.jar wantDeleteParentDir keepDirectoryOrFiles");
System.out.println("for example: java -jar DeleteDirsAddFilter.jar c:\\ \"test\"");
if (args.length != 2) {
System.out.println("parameters length must be 2");
System.exit(0);
}
// File wantDeleteDir = new File("E:\\test\\");
// String filterName = "hello";
File wantDeleteDir = new File(args[0]);
String filterName = args[1];
if (!wantDeleteDir.isDirectory()) {
System.out.println(wantDeleteDir.getPath() + " is not a directory");
System.exit(0);
}
IOFileFilter filterDeleteDir = DirectoryFileFilter.DIRECTORY;
FileFileFilter fileFiter = (FileFileFilter) FileFileFilter.FILE;
Collection<File> filesAndDirs = FileUtils.listFilesAndDirs(
wantDeleteDir, fileFiter, filterDeleteDir);
System.out.println("Total Files/Dirs in " + wantDeleteDir.getPath() +": " + filesAndDirs.size());
int countFile = 0;
ArrayList<FileMatchPath> allLeafDirs = listAllChildDirs(wantDeleteDir);
System.out.println("Total Dirs in " + wantDeleteDir.getPath() +": " + allLeafDirs.size());
FileMatchPath toFile = new FileMatchPath();
FileMatchPath tempToFile = new FileMatchPath();
ArrayList<FileMatchPath> resultFileMatch = new ArrayList<FileMatchPath>();
for (FileMatchPath leafDir : allLeafDirs) {
if (isNotDeltedFile(leafDir.getFile(), filterName)) {
countFile++;
String toFilePath = wantDeleteDir.getParentFile().getAbsolutePath() + "\\temp11" + countFile;
File toFileFile = new File(toFilePath);
toFile.setFile(toFileFile);
if(leafDir.getFile().exists()) {
tempToFile = moveMatchFiles(leafDir, toFile);
resultFileMatch.add(tempToFile);
}
}
}
FileUtils.deleteDirectory(wantDeleteDir);
wantDeleteDir.mkdir();
System.out.println("Total contains " + filterName + " size: " + resultFileMatch.size());
if(resultFileMatch.size() != 0) {
for(FileMatchPath fromFile : resultFileMatch) {
File toFileFile = new File(fromFile.getPath());
FileUtils.moveDirectory(fromFile.getFile(), toFileFile);
System.out.println("contain file: " + toFileFile.getAbsolutePath());
}
}
System.out.println("All Files handle successful");
} /**
* validate a dir's name is equals to <code>filterName</code>
* @param dir
* @param filterName
* @return
*/
private static boolean isNotDeltedFile(File dir, String filterName) {
if (dir.isDirectory() && dir.getName().equals(filterName)) {
return true;
}
return false;
} /**
* move dir to a new destination,
* this file get from a <code>FileMatchPath</code>, and store from file's path to new toDirMatchPath
* @param fromDirMatchPath
* @param toDirMatchPath
* @return
* @throws IOException
*/
private static FileMatchPath moveMatchFiles(FileMatchPath fromDirMatchPath, FileMatchPath toDirMatchPath) throws IOException {
FileUtils.moveDirectory(fromDirMatchPath.getFile(), toDirMatchPath.getFile());
FileMatchPath destFileMatchPath = new FileMatchPath(toDirMatchPath.getFile(), fromDirMatchPath.getPath());
return destFileMatchPath;
} /**
* List all dirs in rootDir
* @param rootDir find its child dirs
* @return all <code>rootDir</code>'s child dirs
*/
private static ArrayList<FileMatchPath> listAllChildDirs(File rootDir) {
ArrayList<FileMatchPath> leafDirs = new ArrayList<FileMatchPath>();
IOFileFilter filterDeleteDir = DirectoryFileFilter.DIRECTORY;
FileFileFilter fileFiter = (FileFileFilter) FileFileFilter.FILE;
Collection<File> filesAndDirs = FileUtils.listFilesAndDirs(
rootDir, fileFiter, filterDeleteDir);
for(File file : filesAndDirs) {
if(file.isDirectory()) {
FileMatchPath fileMatch = new FileMatchPath();
fileMatch.setFile(file);
fileMatch.setPath(file.getAbsolutePath());
leafDirs.add(fileMatch);
}
}
return leafDirs;
}
}
View FileDelete Code
这个类是主要方法,步骤首先找到那些符合条件的文件夹,然后把他们复制到其他地方,再删除当前目录,再把那些目录复制回来。
整体过程比较简单,我本来想用数据结构树的玩法来弄,但是没想出什么比较的方法,就比较土的这么玩了。
但是这么玩,也有个问题要解决,那就是,需要记住被复制出去的那些文件夹的最初始路径,因为后面还要复制回来。因此,我加了个FileMatchPath类。
这个类映射了文件和路径,这样的话,我就能把之前的路径给保存起来了。FileMatchPath类的代码。
package com.zuishiming.filedelete; import java.io.File; /**
*
* store file and path match
* the path can be file's path or
* other file's path
* @author 草原战狼
*
*/
public class FileMatchPath{
private File file;
private String path;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getPath() {
return this.path;
}
public void setPath(String path) {
this.path = path;
}
public FileMatchPath() {
}
public FileMatchPath(File file, String path) {
this.file = file;
this.path = path;
}
}
View FileMatchPath Code
这样的话,做完就可以Export出来了,我Export出来的可执行jar文件为:DeleteDirsAddFilter.jar
通过java执行:

执行后的结果如下:

这样的话,表示我们成功了。
草原战狼淘宝小店:http://xarxf.taobao.com/ 淘宝搜小矮人鞋坊,主营精致美丽时尚女鞋,为您的白雪公主挑一双哦。谢谢各位博友的支持。
===============================================================================
========================== 以上分析仅代表个人观点,欢迎指正与交流 ==========================
========================== 尊重劳动成果,转载请注明出处,万分感谢 ==========================
===============================================================================

【原创】java删除未匹配的文件夹FileFileFilter,FileUtils,删除目录名字不是某个名字的所有文件夹及其子文件夹的更多相关文章
- Java删除文件夹和文件
转载自:http://blog.163.com/wu_huiqiang@126/blog/static/3718162320091022103144516/ 以前在javaeye看到过关于Java操作 ...
- 【转】Java删除文件夹和文件
原文网址:http://kxjhlele.iteye.com/blog/323657 以前在javaeye看到过关于Java操作文件的一篇文章,写的很好,但找了半天也没找到,就把找到底几篇文章整理一下 ...
- java删除文件夹下所有文件
package org.sw; import java.io.File; /** * * @author mengzw * @since 3.0 2014-2-26 */ public class D ...
- 删除未加入svn版本控制的文件(包括文件夹)
删除未加入svn版本控制的文件(包括文件夹) svn status | grep '^?' | awk '{print $2}' | xargs rm -rf
- java删除文件夹及子目录
package test; import java.io.FileNotFoundException; import java.io.IOException; import java.io.File; ...
- java删除文件夹
想删除本地一个项目目录,结果windows说路径太长,不能删除.于是试了试java删除.一切ok.以后一定要抓紧时间学python. /** * Created by rmiao on 4/21/20 ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- git怎样删除未监视的文件untracked files ?
git怎样删除未监视的文件untracked files 需要添加到.gitignore文件 # 删除 untracked files git clean -f # 连 untracked 的目录也一 ...
随机推荐
- Maven报错找不到jre
常规配置maven环境变量,报错: The JAVA_HOME environment variable is not defined correctly. This environment vari ...
- Maven 配置tomcat插件
使用tomcat插件来访问maven 1 先下载tomcat插件(在pom中配置) <!-- 配置Tomcat插件 --> <plugin> <groupId>or ...
- HTC Vive的定位技术
Lighthouse空间定位,chaperone系统避免实际障碍物 HTC vive所用的Lighthouse技术属于激光定位技术,Oculus Rift以及索尼PlayStation VR所用的定位 ...
- 3.4 SpringBoot发送邮件
spring官方提供了spring-boot-starter-mail来整合邮件发送功能,本质上还是利用了JavaMailSender类. 首先我们要在项目中引入相关依赖 <parent & ...
- PyQt
知识内容: 1. 2. 3. 以后有时间再写...
- 数据库之SQL笛卡尔积
1.笛卡尔积定义 笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join).所有连接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据任意组合,上图中两个表 ...
- sqlserver查询---分配cpu等资源
数据库资源按需分配 https://www.cnblogs.com/i6first/p/4138365.html https://blog.csdn.net/kk185800961/article/d ...
- setdeamon 设置 线程为守护线程, (lock线程锁, BoundedSemaphore,rlock递归锁 ) 三种锁
1.setdeamon 当主程序执行完时,子程序自动被销毁 ,内存自动被收回 例一: import threading, time def run(n): print('run %s'%n) time ...
- Simple2D-17(音乐播放器)嵌入 ImGui 库
要把 ImGui 应用到项目中,先拷贝方框中的源文件到项目: 这些文件是 ImGui 的实现源码,可作为第三方库新建一个文件夹进行放置. 接下来是渲染部分的代码,项目可能使用 DirectX 或 Op ...
- UI5-文档-4.35-Responsiveness
在这一步中,我们将改进应用程序的响应能力.SAPUI5应用程序可以在手机.平板电脑和桌面设备上运行,我们可以对应用程序进行配置,以便为每个场景充分利用屏幕空间.幸运的是,SAPUI5控件类似于sap. ...