在日常工作中,经常会遇到批量操作系统文件的事情,通常情况下,只能手动重复的完成批量文件的操作,这样很是费时费力。
本案例要求编写一个文件管理器,实现文件的批量操作。
文件管理器具体功能要求如下:
- 用户输入指令1,代表“
指定关键字检索文件
”,此时需要用户输入检索的目录和关键字,系统在用户指定的目录下检索出文件名中包含关键字的文件,并将其绝对路径展示出来。 - 用户输入指令2,代表“
指定后缀名检索文件
”,此时需要用户输入检索的目录和后缀名(多个后缀名用逗号分隔),系统在用户指定的目录下检索出指定后缀名的文件,并将其绝对路径展示出来。 - 用户输入指令3,代表“
删除文件/目录
”,此时需要用户输入需要删除掉的文件目录,程序执行后会将目录以及目录下的内容全部删除。
- 用户输入指令4,代表“
退出
”,即退出该文件管理器程序。
package cn.javabs.cases; import java.io.File; import java.util.ArrayList; import java.util.Scanner; public class DocManager { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); System.out.println("--1:指定关键字检索文件 2:指定后缀名检索文件 " + "3:删除文件/目录 4:退出--"); while (true) { System.out.print("请输入指令:"); int command = sc.nextInt(); switch (command) { case 1: //指定关键字检索文件 searchByKeyWorld(); break; case 2: //指定后缀名检索文件 searchBySuffix(); break; case 3: //删除文件/目录 deleteDir(); break; case 4: //退出 exit(); break; default: System.out.println("您输入的指令错误!"); break; } } } // *********1.指定关键字检索文件********* private static void searchByKeyWorld() { Scanner sc = new Scanner(System.in); System.out.print("请输入要检索的目录位置:"); String path = sc.next();//从控制台获取路径 File file = new File(path); //判断目录是否存在,是否是目录 if (!file.exists() || !file.isDirectory()) { System.out.println(path + " (不是有效目录)"); return; } System.out.print("请输入搜索关键字:"); String key = sc.next();//获取关键字 //在输入目录下获取所有包含关键字的文件路径 ArrayList<String> list = FileUtils.listFiles(file, key); for (Object obj : list) { //将路径打印到控制台 System.out.println(obj); } } // *********2.指定后缀名检索文件********// private static void searchBySuffix() { Scanner sc = new Scanner(System.in); System.out.print("请输入要检索的目录位置:"); String path = sc.next();//从控制台获取路径 File file = new File(path); //判断目录是否存在,是否是文件夹 if (!file.exists() || !file.isDirectory()) { System.out.println(path + " (不是有效目录)"); return; } System.out.print("请输入搜索后缀:"); String suffix = sc.next(); //获取后缀字符串 String[] suffixArray = suffix.split(","); //在输入目录下获取所有指定后缀名的文件路径 ArrayList<String> list = FileUtils.listFiles(file, suffixArray); for (Object obj : list) { //将路径打印到控制台 System.out.println(obj); } } // *********3.删除文件/目录**********// private static void deleteDir() { Scanner sc = new Scanner(System.in); System.out.print("请输入需要删除的源目录:"); String delpath = sc.next();// 从控制台获取源路径 File dir = new File(delpath); // 创建一个代表目录的File对象 doDelete(dir); } private static void doDelete(File dir) { if (dir.exists()) { // 判断传入的File对象是否存在 // 得到File数组 File[] files = dir.listFiles(); // 遍历所有的子目录和文件 for (File file : files) { if (file.isDirectory()) { doDelete(file); // 如果是目录,递归调用deleteDir() } else { // 如果是文件,直接删除 file.delete(); } } // 删除完一个目录里的所有文件后,就删除这个目录 dir.delete(); } } // *********4.退出**********// private static void exit() { System.out.println("您已退出系统,谢谢使用!"); System.exit(0); } }
工具类:
import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; public class FileUtils { /** * 指定关键字检索文件 * @param file File对象 * @param key 关键字 * @return 包含关键字的文件路径 */ public static ArrayList<String> listFiles(File file, final String key){ // 创建过滤器对象 FilenameFilter filter = new FilenameFilter() { // 实现accept()方法 public boolean accept(File dir, String name) { File currFile = new File(dir, name); // 如果文件名包含关键字返回true,否则返回false if (currFile.isFile() && name.contains(key)) { return true; } return false; } }; //递归方式获取规定的路径 ArrayList<String> arraylist = fileDir(file, filter); return arraylist; } /** * 指定后缀名检索文件 * @param file File对象 * @param suffixArray 后缀名数组 * @return 指定后缀名的文件路径 */ public static ArrayList<String> listFiles(File file, final String[] suffixArray) { FilenameFilter filter = new FilenameFilter() { // 创建过滤器对象 // 实现accept()方法 public boolean accept(File dir, String name) { File currFile = new File(dir, name); if (currFile.isFile()) { for (String suffix : suffixArray) { if (name.endsWith("." + suffix)) { return true; } } } return false; } }; //递归方式获取规定的路径 ArrayList<String> arraylist = fileDir(file, filter); return arraylist; } /** * 递归方式获取规定的路径 * @param dir File对象 * @param filter 过滤器 * @return 过滤器过滤后的文件路径 */ public static ArrayList<String> fileDir(File dir, FilenameFilter filter){ ArrayList<String> arraylist = new ArrayList<String>(); // 获得过滤后的所有文件数组 File[] lists = dir.listFiles(filter); for (File list : lists) { //将文件的绝对路径放到集合中 arraylist.add(list.getAbsolutePath()); } // 获得当前目录下所有文件的数组 File[] files = dir.listFiles(); // 遍历所有的子目录和文件 for (File file : files) { if (file.isDirectory()) { // 如果是目录,递归调用fileDir() ArrayList<String> every = fileDir(file, filter); arraylist.addAll(every);//将文件夹下的文件路径添加到集合中 } } //此时的集合中有当前目录下的文件路径,和当前目录的子目录下的文件路径 return arraylist; } }