一个简单的文件搜索器
概述:该文件搜索器,根据文件名进行搜索,并且支持通配符(通配符“?”表示任意一个字符,通配符“*”表示任意多个字符)。
关键算法:
采用广度优先查找算法,即优先搜索当前目录下的文件,再搜索子目录下的文件。
①、 从某个给定的需查找的文件夹出发,搜索该文件夹的所有子文件夹及文件。
②、 若为文件则进行匹配,匹配成功则加入结果集,若为子文件夹,则进队列。
③、 队列不空,重复上述操作,队列为空,程序结束,返回结果。
具体实现:
main() { String baseDIR = “C:/temp”;//在此目录中查找 String fileName = “*.txt”;//可以是?.txt 或一个确切的文件如my.txt List resultList = FindFiles( baseDIR,fileName); if(resultList.size() == 0) 没有找到; else for(….;resultList.size;…) System.out.println(resultList.get(i)); }
//查找方法 FindFiles( baseDIR,fileName) { List fileList = new ArrayList(); File baseDir = new File( baseDirName); 判断目录是否存在; Queue queue = new Queue(); queue.add(baseDir);//将该目录入队 While(!queue.isEmpty()) { File tempFile = (File)queue.pop(); File[] files = tempFile.listFiles()//列出所有子目录及文件 if(目录) 进队列; else WildcardMatch();//去匹配 }
匹配方法://难点,列出完整代码 wildcardMatch(String pattern, String str) { //pattern 查找的文件,“*.txt”,str = “my.txt” int patternLength = pattern.length(); int strLength = str.length(); int strIndex = 0; char ch; for (int patternIndex = 0; patternIndex < patternLength; patternIndex++) { ch = pattern.charAt(patternIndex); //返回一个字符 if (ch == '*') //查找全部的TXT文件 { //通配符星号*表示可以匹配任意多个字符 while (strIndex < strLength) { if (wildcardMatch(pattern.substring(patternIndex + 1), str.substring(strIndex))) {//substring(i),从字符串中第i位开始取,取到字符串的尾部。 return true; } strIndex++; } } else if (ch == '?') //情况二:查找文件名为一个字符的TXT文件 { //通配符问号?表示匹配任意一个字符 strIndex++; if (strIndex > strLength) { //表示str中已经没有字符匹配?了。 return false; } } else //情况三:查找确切的文件 { if ((strIndex >= strLength) || (ch != str.charAt(strIndex))) { return false; } strIndex++; } } return (strIndex == strLength); }
|
知识拓展:
在信息系统的信息查询中经常需要判断一个字符串中是否含有按序出现折若干个字符串,由于在高级语言和常用数据库中没有提供通配符匹配操作,一般采用包含运算或判断一个字符串是否为另一个字符串的函数以及逻辑运算来实现,但是这种方法不能有效的表达各字符串出现的先后次序,扩大了查询结果的范围,降低了查询的精度,由于通配符匹配方法具有指定字符串的出现顺序的特点,因此有效的查询方法是采用通配符方法进行要查询的信息与查询对象的匹配。
问题:有字符串S1、S2,S1 = X1*X2*X3*…*Xn,其中X1,…,Xn为不含*的字符串,*是通配符,代表任一串字符,试判断S2是否匹配S1。
说明:S2匹配S1是指X1,X2,…Xn按先后次序,依次在S2中出现。
算法:
①、 若S1为空字符串,返回T。
②、 取NS1为S1,NS2为S2。
③、 当NS1非空字符串时,循环执行④、⑤两步。
④、 当NS1中有*,则取XS为NS1中第一个*前的子字符串,NS1取原NS1中第一个*后所有的字符。
⑤、 若XS不是NS2的子字符串,返回F。否则NS2取原NS2中第一次出现XS之后所有字符。
⑥、 返回T。
参考文献:
《JAVA JDK 实例宝典》夏先波。
淮南师专 胡江红《通配符匹配算法及其在FOXPRO中的实现》