java删除文件支持通配符
原文:https://blog.csdn.net/wdzayyt/article/details/7209530
感谢原作者
package com.covics.zfh; import java.io.File; import java.io.FilenameFilter; /** * 实现带*号的删除文件 * @author doudou * */ public class TestDeleteFile { public static void main(String args[]) { boolean delFile = //windows //deleteFileWithSign("E:\\fileDeleteTest\\test\\t*ve.txt"); //linux deleteFileWithSign("/home/work/ssst*ve.txt"); System.out.println("main---->"+delFile); } /** * 删除带*的文件 * @param fileName * @return */ public static boolean deleteFileWithSign(String fileName) { // 文件夹名称 String dirName = ""; // 要删除的文件类型 String fileType = ""; // 不带后缀的文件名 String nameWithoutType = ""; // *号个数 int num = 0; if (null == fileName || "".equals(fileName)) { return false; } String osName = System.getProperty("os.name") if (osName.toLowerCase().contains("windows")){ int index = fileName.lastIndexOf("\\") + 1; }else{ int index = fileName.lastIndexOf("/") + 1; } nameWithoutType = fileName.substring(index, fileName.lastIndexOf(".")); fileType = fileName .substring(fileName.lastIndexOf("."), fileName.length()); dirName = fileName.substring(0, index); File dir = new File(dirName); System.out.println("dir:"+dir); System.out.println("exits"+dir.exists()); System.out.println("dir.isDirectory()"+dir.isDirectory()); if (!dir.exists() || !dir.isDirectory()) { return false; } // *号的位置 int start = -1, end = -1; start = nameWithoutType.indexOf("*"); end = nameWithoutType.lastIndexOf("*"); int length = nameWithoutType.length(); for (int i=0;i<length;i++) { if ('*' == nameWithoutType.charAt(i)) { num++; } } System.out.println("num---->"+num); // 删除的类型 int delType = 0; switch (num) { case 0 : return deleteFile(fileName); case 1 : // 只有一个*号的情况 if (0==start) { // 在开始的位置 delType = 1; // 只调用endWith方法 } else if (length-1 == start) { // 在结束的位置 delType = 2; // 只调用startWith方法 } else { // 在中间 delType = 3; // 只调用contain方法 } break; default : // 有两个或多个*号的情况 if (0 == start && length-1 == end) { // 在开始的位置和结束的位置都有*号 delType = 4; // 只调用contain方法 } else if (0 == start && length-1 != end) { // 开始的位置有*号且结束的位置没有*号 delType = 5; // 调用contain和endWith方法 } else if (0 != start && length-1 == end) { // 开始的位置没有*号且结束的位置有*号 delType = 6; // 调用startWith和contain方法 } else { // *号在中间 的情况(开始和结束都没有*号) delType = 7; // 只调用contain方法 } break; } boolean flag = false; String[] names = dir .list(new DelFileFilter(nameWithoutType, fileType, delType)); System.out.println("names.length---->"+names.length); for (int i = 0; i < names.length; i++) { System.out.println("f--names-->"+dirName+names[i]); File f = new File(dirName + names[i]); if (!f.exists() || !f.isFile()) { return false; } flag = deleteFile(f.getAbsolutePath()); if (!flag) { break; } } return flag; } /** * 删除单个文件 * * @param fileName * @return */ public static boolean deleteFile(String fileName) { File file = new File(fileName); if (file.isFile() && file.exists()) { file.delete(); return true; } return false; } /** * 删除文件夹 * * @param dir * @return */ public static boolean deleteDir(String dir) { // 判断是否有带文件夹符号。 if (!dir.endsWith(File.separator)) { dir = dir + File.separator; } File file = new File(dir); if (!file.isDirectory() || !file.exists()) { return false; } boolean flag = true; File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isFile()) { // 删除文件 flag = deleteFile(files[i].getAbsolutePath()); if (!flag) { break; } } else if (files[i].isDirectory()) { // 删除文件夹 flag = deleteDir(files[i].getAbsolutePath()); if (!flag) { break; } } else { return false; } } if (file.delete()) { // 删除自身 return true; } return false; } } /** * FileFilter类 * 删除带*文件 * @author doudou * */ class DelFileFilter implements FilenameFilter { // 传进来的文件URL String fileName; String fileType; // 文件类型 // 删除的类型。 1:*号在开头; 2:*号在末尾 int delType; public DelFileFilter(String name, String fileType, int delType) { this.fileType = fileType; this.delType = delType; this.fileName = name; } @Override public boolean accept(File dir, String name) { // 将文件名分割顾字符串 String[] ss = fileName.split("[*]"); // 首先判断是否是要删除的文件类型 if (!isThisTypeFile(name)) { return false; } boolean flag = true; switch (delType) { case 1 : for (String s : ss) { if (!"".equals(s)){ flag = endWithS(name, s); } } return flag; case 2 : for (String s : ss) { if (!"".equals(s)){ flag = startWithS(name, s); } } return flag; case 3 : case 4 : case 7 : for (String s : ss) { if (!"".equals(s)) { flag = contains(name, s); if (!flag) { break; } } } return flag; case 5 : boolean flag1 = false, flag2 = false; for (int i=0;i<ss.length;i++) { if (!"".equals(ss[i])) { if (i != ss.length-1 && !"".equals(ss[i])) { flag1 = contains(name, ss[i]); if (!flag1) { break; } } if (i == ss.length-1) { flag2 = endWithS(name, ss[i]); } } } flag = flag1 && flag2; return flag; case 6 : boolean flag3 = false, flag4 = false; flag3 = startWithS(name, ss[0]); for (int i=1;i<ss.length;i++) { if (!"".equals(ss[i])) { flag4 = contains(name, ss[i]); if (!flag4) break; } } flag = flag3 && flag4; return flag; default : flag = false; return flag; } } /** * 判断是否是该类型的文件 * @param file * @return */ public boolean isThisTypeFile(String file) { return file.toLowerCase().endsWith(fileType); } /** * 包含某字符 * @param file * @param str * @return */ public boolean contains(String file, String str) { return (file.toLowerCase().contains(str)); } /** * 以某字符开始 * @param file * @param str * @return */ public boolean startWithS(String file, String str) { return file.toLowerCase().startsWith(str); } /** * 以file字符结束 * @param file * @param str * @return */ public boolean endWithS(String file, String str) { return file.toLowerCase().endsWith(str+fileType); } }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步