【原创】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 的目录也一 ...
随机推荐
- 2015ACM-ICPC长春E题(hdu5531)题解
一.题意 No response.T_T 二.思路 分$n$为奇数或者偶数讨论. 如果$n$是奇数,列出不等式组:$r_1+r_2=d_{1},r_2+r_3=d_{2},r_3+r_4=d_{3}, ...
- 初学 python 之 用户登录实现过程
要求编写登录接口 : 1. 输入用户名和密码 2.认证成功后显示欢迎信息 3.用户名输错,提示用户不存在,重新输入(5次错误,提示尝试次数过多,退出程序) 4.用户名正确,密码错误,提示密码错误,重新 ...
- 【RL前沿】深度强化学习的最新进展 by 2017.12.12
作者:Volodymyr Mnih Google DeepMind科学家. 在Geoffrey Hinton的指导下完成了多伦多大学的机器学习博士学位. 在此之前,在Csab Szepesvari的指 ...
- 编译器错误消息: CS0016: 未能写入输出文件“c:/Windows/Microsoft.NET/Framework/v4.0.50727/Temporary ASP.NET Files/root .... 拒绝访问。
此问题困扰良久,得终极解决方案 环境:windows 2008 server r2 + iis7 + .net framework4.5 解决:1. 错误信息中包含的目录“c:/Windows/Mic ...
- ajax json用法 上传文件 登录
1. json json 是一种数据结构 跨平台跨语言 1. python中json数据的转换 1.数据类型 字符串 数字 布尔值 列表 字典 None 2. 序列化 ...
- memcache.so的报错信息,未解决
memcache.so php版本5.6 executor_globals_id in Unknown on line 0 编译也成功了,路径也是在其他so文件的目录 但是加载失败的,查看apache ...
- jpa-入门.缓存配置ehcache.xml
<ehcache> <!-- Sets the path to the directory where cache .data files are created. If the p ...
- Maven可执行jar包
参考文章: Maven生成可以直接运行的jar包的多种方式(http://blog.csdn.net/xiao__gui/article/details/47341385) 一般,我们通过 > ...
- OpenSL ES 查询设备支持的SL Profiles
opensl es 提供了三种类型:分别是 SL_PROFILES_PHONE(手机):SL_PROFILES_MUSIC(音乐); SL_PROFILES_GAME (游戏). 如果你使用的手机的开 ...
- 【干货】国外程序员整理的 C++ 资源大全(转)
转zi:http://www.csdn.net/article/2014-10-24/2822269-c++ 关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz发起和维护. 内容包括:标准 ...