【原创】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 的目录也一 ...
随机推荐
- 自己写的jQuery拖动滑块
(function ($) { $.fn.bnSlide = function (options) { var defaults = { colorData: 0, //原始滑道的有效值 maxWid ...
- securecrt8注册码
securecrt8注册码,两个可用 Name:meisiCompany:TEAM ZWTSerial Number:03-14-367662License Key:ACCFAX R9FHJ7 QZV ...
- 信息学奥赛(NOIP)初赛学习方法推荐
首先声明:本帖针对初学者,本帖只是列出一个大概的框架,不属于自学方法,有条件有能力,请找一位好老师来教,多跟前辈交流经验.(否则多会出现事倍功半的悲剧!) 一.初赛内容 初赛偏重于基础知识. 1. 一 ...
- 使用SolrNet访问Solr-5.5.0
由于今年年初刚发布的Solr-5.5.0,网上所能找到的资料少之又少,所以只能靠自己一点点摸索. 从某Hub上下载了SolrNet源码,按照教程提交文档或者查询均失败,无奈只得跟断点一点点差怎么回事. ...
- springboot根据不同的条件创建bean,动态创建bean,@Conditional注解使用
这个需求应该也比较常见,在不同的条件下创建不同的bean,具体场景很多,能看到这篇的肯定懂我的意思. 倘若不了解spring4.X新加入的@Conditional注解的话,要实现不同条件创建不同的be ...
- linux操作系统2 linux常用命令
知识内容: 1.目录及文件操作 2.用户.群组与权限 3.重定向.管道 4.磁盘存储管理 5.系统命令 6.其他命令 参考: http://man.linuxde.net/ Linux命令规则:目录名 ...
- 10.Action中的method属性
转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在struts1.x中我们知道通过继承DispatchAction可以实现把 ...
- JS的prototype和__proto__、constructor
看了JS的prototype和__proto__这篇文章,才感觉很清晰了,对于原型这块,以前经常把这些属性弄不清楚, 明白了之后保存下整理下: prototype: 是函数的一个属性(每个函数都有一个 ...
- Java8函数之旅(四) --四大函数接口
前言 Java8中函数接口有很多,大概有几十个吧,具体究竟是多少我也数不清,所以一开始看的时候感觉一脸懵逼,不过其实根本没那么复杂,毕竟不应该也没必要把一个东西设计的很复杂. 几个单词 在学习 ...
- Matlab学以致用 - 曲线拟合
曲线拟合 使用Matlab自带的polyfit函数,可以很方便地根据现有样本数据进行多项式曲线拟合,为了有直观感受,先上例程,如下所示: x = -:; % 样本数据x坐标 y = *x.^ + *x ...