其中的核心方法是使用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 + ", ";
}
}