由于工作需要,写了一个关于支持通配符的批量删除文件或文件夹

 以前CSDN账号的密码竟然提示密码不正确,无奈只能重新注册博客了。悲剧。。。

 

实习中,公司需要支持如下格式的删除文件:

"E:\DelFIle\Test\test*.txt"或者类似的,反正带*号的删除。

 

话不多说直接上代码,希望你们用到的时候有个参考。

 

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 =
		 deleteFileWithSign("E:\\fileDeleteTest\\test\\t*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;
		}
		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 = endWithS(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);
	}
}

如有任何疑问请留言,如喜欢,请收藏或转载,但请注明出处,谢谢。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Linux中批量删除文件夹,可以使用rm命令结合通配符来实现。例如,使用rm -rf命令可以强制递归删除指定目录下的所有文件文件夹。可以使用通配符来指定要删除文件夹的名称。例如,使用rm -rf folder*可以删除以"folder"开头的所有文件夹。\[1\] 另外,还可以使用find命令来查找并删除指定目录下的文件夹。例如,使用find /root/baseline_dataset -name ".ipynb_checkpoints" | xargs rm -rf命令可以查找并删除/root/baseline_dataset目录下名为".ipynb_checkpoints"的文件夹。\[2\] 如果需要一次性级联创建多级不同的目录,可以使用mkdir命令结合大括号和逗号来实现。例如,使用mkdir -p src/{{main,test}/{java,resources},main/webapp}命令可以一次性创建多级不同的目录。\[3\] 总结起来,要在Linux中批量删除文件夹,可以使用rm命令结合通配符或使用find命令来查找并删除指定目录下的文件夹。同时,可以使用mkdir命令结合大括号和逗号来一次性级联创建多级不同的目录。 #### 引用[.reference_title] - *1* *3* [Linux技巧(三): seq命令 / mkdir -p 批量创建/删除文件夹 详解](https://blog.csdn.net/xp871038951/article/details/122286002)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [linux批量删除指定名称的文件夹](https://blog.csdn.net/qq_27468223/article/details/124023510)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值