Android 开发实用工具类:删除指定目录下指定格式文件(计算指定目录下指定格式文件总大小)

        开发的时候我们可能会遇到一些需求:遍历删除指定目录下的指定格式的文件。

        这里提供一个工具类,其对外暴露三个参数,参数一:要删除的文件目录的路径,参数二:区分是前缀还是后缀,参数三:具体前缀或者后缀字符规则。删除的时候,先枚举出路径目录下的所有文件,枚举的同时实现一个FilenameFilter接口的类,可以自定义规则,比说前缀、后缀或者其他规则,枚举的同时将我们的过滤器作为参数,这样我们就可以匹配到指定条件的文件,然后删除即可。

        首先定义 DeleteFileFilter.java

package com.example.testbaiduinputfilesizedemo;

import androidx.annotation.NonNull;

import java.io.File;
import java.io.FilenameFilter;

public class DeleteFileFilter implements FilenameFilter {

    private boolean isPrefix;
    private String mRegEx;// 前缀或后缀规则

    public DeleteFileFilter(boolean isPrefix, @NonNull String regEx) {
        this.isPrefix = isPrefix;
        this.mRegEx = regEx;
    }

    @Override
    public boolean accept(File file, String s) {
        return isPrefix ? s.startsWith(mRegEx) : s.endsWith(mRegEx);
    }
}

接下来,定义具体的实现逻辑,因为是对于文件的读写操作,所以逻辑最好是放到 Runnable中,定义 DeleteRunnable.java:

package com.example.testbaiduinputfilesizedemo;


import android.text.TextUtils;
import android.util.Log;

import java.io.File;

public class DeleteRunnable implements Runnable{

    private String mRegEx;
    private String dirPath;
    private boolean isPrefix;
    private static final String TAG = DeleteRunnable.class.getSimpleName();

    /**
     * Constructor
     *
     * @param dirPath  要删除文件所在的目录路径
     * @param isPrefix true为前缀 false为后缀
     * @param mRegEx   规则
     */
    public DeleteRunnable(String dirPath, boolean isPrefix, String mRegEx) {
        this.mRegEx = mRegEx;
        this.dirPath = dirPath;
        this.isPrefix = isPrefix;
    }

    @Override
    public void run() {
        enumAllFileList();
    }

    /**
     * 枚举并删除所有符合条件(前缀)的文件
     */
    private void enumAllFileList() {
        if (!TextUtils.isEmpty(dirPath)) {
            File adDir = new File(dirPath);
            if (adDir.exists() && adDir.isDirectory()) {
                if (!TextUtils.isEmpty(mRegEx)) {
                    DeleteFileFilter filter = new DeleteFileFilter(isPrefix, mRegEx);
                    // 2.匹配是否是需要删除的文件
                    File[] fileList = adDir.listFiles(filter);
                    if (fileList != null && fileList.length > 0) {
                        for (File file : fileList) {
                            if (file.isFile() && file.exists()) {
                                boolean delete = file.delete();
                                Log.i(TAG, "删除符合条件的文件" + (delete ? "成功~" : "失败!"));
                            }
                        }
                    }
                }
            }
        }
    }
}

最后最好是放到线程池中,对外使用,定义  DeleteUtil.java :

package com.example.testbaiduinputfilesizedemo;


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class DeleteUtil {

    private static final ExecutorService executor = Executors.newSingleThreadExecutor();

    /**
     * 删除指定目录指定前后缀的文件
     *
     * @param dirPath
     * @param isPrefix
     * @param regEx
     */
    public static void delete(String dirPath, boolean isPrefix, String regEx) {
        executor.execute(new DeleteRunnable(dirPath, isPrefix, regEx));
    }
}

        以上就是完整的工具类,当使用的时候,只需要像下面一样调用即可:

//删除 /sdcard/DCIM/Camera/ 下的文件
DeleteUtil.delete("/sdcard/DCIM/Camera/", false, ".jpg");

       

 

        其实,根据以上的相关代码,我们还可以实现另一个功能:计算指定目录下指定格式文件总大小。相关代码如下:

    private long getAllTargetFileSizes(String dirPath, boolean isPrefix, String mRegEx){
        long targetFileSizes= 0L;
        if (!TextUtils.isEmpty(dirPath)) {
            File adDir = new File(dirPath);
            if (adDir.exists() && adDir.isDirectory()) {
                if (!TextUtils.isEmpty(mRegEx)) {
                    FileFilter filter = new FileFilter(isPrefix, mRegEx);
                    // 匹配是否是需要考虑计算在内的文件
                    File[] fileList = adDir.listFiles(filter);
                    if (fileList != null && fileList.length > 0) {
                        for (File file : fileList) {
                            if (file.isFile() && file.exists()) {
                                //计算大小
                                targetFileSizes += file.length();
                                Log.i("heguodong", " -->" + targetFileSizes);
                            }
                        }
                    }
                }
            }
        }
        Log.i("heguodong", "总的这几个文件的大小是 -->" + targetFileSizes);
        return targetFileSizes;
    }

    class FileFilter implements FilenameFilter {

        private boolean isPrefix;
        private String mRegEx;// 前缀或后缀规则

        public FileFilter(boolean isPrefix, @NonNull String regEx) {
            this.isPrefix = isPrefix;
            this.mRegEx = regEx;
        }

        @Override
        public boolean accept(File file, String s) {
            return isPrefix ? s.startsWith(mRegEx) : s.endsWith(mRegEx);
        }
    }

在使用的时候,只需要如下:

 //计算文件大小  /storage/emulated/0/baidu/tempdata/          /sdcard/baidu/tempdata/

long aaa = getAllTargetFileSizes("/sdcard/baidu/tempdata/",false,".dat");

以上就是全部内容。

 

参考:

https://www.cnblogs.com/angel88/p/8109763.html

https://blog.youkuaiyun.com/qq_34330286/article/details/79660059

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值