闲着无聊,写了个小程序。

需求:

举例: 比如我的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,删除目录名字不是某个名字的所有文件夹及其子文件夹的更多相关文章

  1. Java删除文件夹和文件

    转载自:http://blog.163.com/wu_huiqiang@126/blog/static/3718162320091022103144516/ 以前在javaeye看到过关于Java操作 ...

  2. 【转】Java删除文件夹和文件

    原文网址:http://kxjhlele.iteye.com/blog/323657 以前在javaeye看到过关于Java操作文件的一篇文章,写的很好,但找了半天也没找到,就把找到底几篇文章整理一下 ...

  3. java删除文件夹下所有文件

    package org.sw; import java.io.File; /** * * @author mengzw * @since 3.0 2014-2-26 */ public class D ...

  4. 删除未加入svn版本控制的文件(包括文件夹)

    删除未加入svn版本控制的文件(包括文件夹) svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

  5. java删除文件夹及子目录

    package test; import java.io.FileNotFoundException; import java.io.IOException; import java.io.File; ...

  6. java删除文件夹

    想删除本地一个项目目录,结果windows说路径太长,不能删除.于是试了试java删除.一切ok.以后一定要抓紧时间学python. /** * Created by rmiao on 4/21/20 ...

  7. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. git怎样删除未监视的文件untracked files ?

    git怎样删除未监视的文件untracked files 需要添加到.gitignore文件 # 删除 untracked files git clean -f # 连 untracked 的目录也一 ...

随机推荐

  1. 1115 Counting Nodes in a BST (30 分)

    1115 Counting Nodes in a BST (30 分) A Binary Search Tree (BST) is recursively defined as a binary tr ...

  2. select count(*) as total from(select count(*) from tab_cb_casim group by `card_no`) as cai;

    子查询必须加一个别名才能执行!!

  3. REST 风格

  4. 单元测试工具NUnit的使用

      使用 NUnit 工具来进行单元测试 首先在要创建一个单元测试的项目,通常在原有的解决方案中添加新项目, 在弹出的项目类型中选择单元测试,项目的命名一般情况下与解决方案的名称相同后加UnitTes ...

  5. 修改oracle数据库默认时间格式

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ccchencheng.blog.51cto.com/2419062/929695 ...

  6. Java-IntegerCache

    Integer类里面有一个私有的静态内部类IntegerCache类加载时,有一段静态块代码,如下 static final int low = -128; static final int high ...

  7. 3.纯 CSS 创作一个容器厚条纹边框特效

    原文地址:3.纯 CSS 创作一个容器厚条纹边框特效 没有啥好点子呀,不爽 HTML代码: <div class="box"> <div class=" ...

  8. OpenCL 图像卷积 3 使用 CPU

    ▶ CPU 图像卷积,共四种方法.分别为基本串行,使用模板,使用局部内存,使用AVX指令优化 ● 全部的代码,仅在主函数中选择调用的函数名即可. #include <stdio.h> #i ...

  9. angular 获取当前值

  10. 奇技淫巧:在spring官网上下载历史版本的spring插件,springsource-tool-suite

    转自:https://blog.csdn.net/PacosonSWJTU/article/details/80959689 目前spring官网(http://spring.io/tools/sts ...