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

需求:

举例: 比如我的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. Centos 6.5将光盘作为yum源的设置方法

    Centos 6.5将光盘作为yum源的设置方法 在使用Centos 的时候,用yum来安装软件包是再方便不过了,但是如果在无法连接互联网的情况下,yum就不好用了. 下面介绍一种方式,就是将Cent ...

  2. OpenGL 画出雷达动态扫描效果(一)

    最终效果如下所示 Demo下载  http://files.cnblogs.com/xd-jinjian/Debug.zip 源代码下载 http://download.csdn.net/detail ...

  3. js、C#获取当前url的参数值

    之前很想做一些封装关于获取URL参数值方法,今天简单整理了一下js和后台代码获取url参数值的方法,有什么不好地方,还请大家包涵,代码如下: 1.JS处理URL参数值 <script langu ...

  4. Selenium2+python自动化75-非input文件上传(SendKeys)

    前言 不少小伙伴问非input标签如何上传文档,这个本身就是一坑,无奈很多小伙伴非要跳坑里去,那就介绍一个非主流的上传文件方法吧,用第三方库SendKeys. 只支持python2环境 python3 ...

  5. [Dart] Flutter开发中的几个常用函数

    几个Flutter开发中的常用函数 /** 返回当前时间戳 */ static int currentTimeMillis() { return new DateTime.now().millisec ...

  6. python入门-字典

    1 python是使用{}来表示字典 字典是一系列的键值对 alien_0={} 2 访问字典中的值 new_point = alien_0['point'] print("you just ...

  7. linux7安装teamViewer

    参考网站:http://blog.sina.com.cn/s/blog_15308c8290102x72u.html 下载网站:https://www.teamviewer.com/zhCN/down ...

  8. Delphi 变体数组 Dataset Locate 查找定位

    Format 函数 Delphi 支持“开参数”和动态数组,变体数组,使用时的语法类似 Delphi 中的集合:采用两个方括号把不同类型的变量括起来(这太方便了啊),也可以采用声明一个 TVarRec ...

  9. Web Deploy

    Web Deploy 服务器安装设置与使用 Win2008R2配置WebDeploy Visual Studio 使用Web Deploy发布项目

  10. LInux下LD_LIBRARY_PATH的作用与设置

    LD_LIBRARY_PATH环境变量主要是用于指定动态链接器(Id)超早elf可执行文件运行时所依赖的动态库(so)的路径,其内容是以冒号分隔的路径列表. Id链接器优先在该变量设置的路径中查找,若 ...