杨校老师课堂之基于File类的文件管理器

2023-03-10 11:21:19 浏览数 (1)

在日常工作中,经常会遇到批量操作系统文件的事情,通常情况下,只能手动重复的完成批量文件的操作,这样很是费时费力。

本案例要求编写一个文件管理器,实现文件的批量操作。 文件管理器具体功能要求如下:

  • 用户输入指令1,代表“指定关键字检索文件”,此时需要用户输入检索的目录和关键字,系统在用户指定的目录下检索出文件名中包含关键字的文件,并将其绝对路径展示出来。
  • 用户输入指令2,代表“指定后缀名检索文件”,此时需要用户输入检索的目录和后缀名(多个后缀名用逗号分隔),系统在用户指定的目录下检索出指定后缀名的文件,并将其绝对路径展示出来。
  • 用户输入指令3,代表“删除文件/目录”,此时需要用户输入需要删除掉的文件目录,程序执行后会将目录以及目录下的内容全部删除。
  • 用户输入指令4,代表“退出”,即退出该文件管理器程序。
代码语言:javascript复制
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);
    }
}

工具类:

代码语言:javascript复制
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;
    }
}

0 人点赞