根据关键字搜索某个目录下的文件

其中的核心方法是使用file.getName().indexOf(keyWord) >= 0来判断文件名字是否包含关键字,再结合递归,即可实现“深度”搜索。

一、使用:

FileUtils.searchFiles(dir, keyWord,false, new OnSearchFilesListener());

二、核心代码如下:

1、FileUtils.java:

/* ============== 根据关键字搜索某个目录下的文件begin ============== */

/**
 * @param dir
 *            要搜索的起始目录
 * @param keyWord
 *            关键字
 * @param isInnerRun
 *            是否是本方法内部调用(true则不会调用onFinish,false则会调用onFinish,
 *            外部调用只需要传入false即可)
 * @param onSearchFilesListener
 *            搜索监听
 * @return
 */
public static List<FileItem> searchFiles(String dir, String keyWord,
        boolean isInnerRun, OnSearchFilesListener onSearchFilesListener) {

    // 如果是外部调用,说明是递归前的一层。一开始必须把标题设置为true,递归搜索才会有效(会调用此方法一定是要搜索文件,所以这里默认设置为true)
    if (!isInnerRun) {
        isSearchWorking = true;
    }

    // 1、搜索进行中
    File file = new File(dir);
    // 如果是文件或搜索已经取消就直接返回空(这里判断isSearchWorking主要是结束已经开始的递归)
    if (file.isFile() || !isSearchWorking) {
        return null;
    }

    // 要返回的名字中包含关键字的文件集合
    List<FileItem> searchFiles = new ArrayList<FileItem>();

    // 如果当前路径是文件夹,得到该文件夹下所有的文件及文件夹
    File[] listFiles = file.listFiles();
    for (File file2 : listFiles) {
        // 若是搜索取消了,则不再查找
        if (!isSearchWorking) {
            break;
        }

        // 如果是文件夹,递归继续找,并把找到的文件添加到集合中
        if (file2.isDirectory()) {
            List<FileItem> innerSearchFilesResult = searchFiles(
                    file2.getAbsolutePath(), keyWord, true,
                    onSearchFilesListener);
            if (innerSearchFilesResult != null)
                searchFiles.addAll(innerSearchFilesResult);
        }

        // 如果回调不为空,则返回当前被搜索的文件路径
        if (onSearchFilesListener != null) {
            onSearchFilesListener.onSearch(file2.getAbsolutePath());
        }

        // 如果是文件,则判断是否名字中是否包含关键字
        if (file2.getName().indexOf(keyWord) >= 0) {
            // 得到文件后缀名
            String extFromFilename = FileUtils.getExtFromFilename(file
                    .getName().toLowerCase());
            int fileIcon = FileIconHelper.getFileIcon(extFromFilename);
            int filePic = fileIcon;

            // 如果含有关键字则把文件添加到集合中
            searchFiles.add(new FileItem(filePic, file2.getName(), file2
                    .getAbsolutePath(), getModifiedTime(file2)));
        }
    }

    // 2、搜索已经取消
    if (!isSearchWorking) {
        // 如果是外部调用,说明是递归前的一层,保证只调用一次onCancel
        if (!isInnerRun) {
            if (onSearchFilesListener != null) {
                onSearchFilesListener.onCancel();
            }
        }

        return null;
    }

    // 如果是外部调用,说明是递归前的一层,到了这里说明搜索完了
    if (!isInnerRun) {
        if (onSearchFilesListener != null) {
            onSearchFilesListener.onFinish(searchFiles);
        }
    }

    // 该返回值的作用是给递归时返回数据用的
    return searchFiles;

}

public static boolean isSearchWorking = true;// 标记是否搜索起效

public static interface OnSearchFilesListener {
    void onSearch(String filePath);

    void onCancel();

    void onFinish(List<FileItem> searchFiles);
}
/* ============== 根据关键字搜索某个目录下的文件end ============== */

/**
 * 读取文件的修改时间
 * 
 * @param f
 * @return
 */
public static String getModifiedTime(File f) {
    Calendar cal = Calendar.getInstance();
    long time = f.lastModified();
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    cal.setTimeInMillis(time);
    return formatter.format(cal.getTime());
}

2、FileItem.java中:

/**
 * @创建者 CSDB_LQR
 * @创建时间 2016/3/15 0015
 * @描述 表示一个文件的Bean(文件管理/浏览模块中的一个item)
 */
public class FileItem {
    public int filePic;
    public String fileName;
    public String filePath;
    public String fileModifiedTime;

    public int getFilePic() {
        return filePic;
    }

    public void setFilePic(int filePic) {
        this.filePic = filePic;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    public String getFileModifiedTime() {
        return fileModifiedTime;
    }

    public void setFileModifiedTime(String fileModifiedTime) {
        this.fileModifiedTime = fileModifiedTime;
    }

    public FileItem(int filePic, String fileName, String filePath,
            String fileModifiedTime) {
        super();
        this.filePic = filePic;
        this.fileName = fileName;
        this.filePath = filePath;
        this.fileModifiedTime = fileModifiedTime;
    }

    @Override
    public String toString() {
        return fileName + ", ";
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值