我编写此代码是为了通过递归和支持多个通配符 (*) 的实现来搜索路径的文件。
我的代码在这里:
package filesearch;
import java.io.File;
import java.util.Scanner;
public class FileSearch {
public void walk( String path, String partOfFile ) {
File root = new File( path );
File[] list = root.listFiles();
if (list == null) return;
for ( File f : list ) {
if ( f.isDirectory() ) {
walk( f.getAbsolutePath(), partOfFile );
}
else {
if(match(f.getAbsolutePath(), partOfFile)){
System.out.println( "File:" + f.getAbsoluteFile() );
}
else{
}
}
}
}
public boolean match(String fileName, String partOfFileName){
if(partOfFileName.indexOf("*") == -1){
if(fileName.equalsIgnoreCase(partOfFileName))
return true;
else
return false;
}
else{
if(partOfFileName.indexOf("*") == partOfFileName.length()-1){
if(fileName.startsWith(partOfFileName.substring(0, partOfFileName.indexOf("*"))))
return true;
}
if(partOfFileName.indexOf("*") == 0 ){
if(partOfFileName.indexOf("*", 1) == -1){
if(fileName.endsWith(partOfFileName.substring(1)))
return true;
}
else{
String betweenAsteriks = partOfFileName.substring(1, partOfFileName.indexOf("*", 1));
if(fileName.indexOf(betweenAsteriks) != -1){
match(fileName, partOfFileName.substring(partOfFileName.indexOf("*", 1)));
}
else{
return false;
}
}
}
if(partOfFileName.indexOf("*") != 0 && partOfFileName.indexOf("*")!=partOfFileName.length()-1){
return (match(fileName, partOfFileName.substring(partOfFileName.indexOf("*"))) && match(fileName, partOfFileName.substring(0, partOfFileName.indexOf("*")+1)));
}
return false;
}
}
public static void main(String[] args) {
FileSearch fw = new FileSearch();
Scanner s = new Scanner(System.in);
String partOfFileName = s.next();
fw.walk("h:\\" , partOfFileName);
}
}
但是当我在执行中使用多个 (*) 时,它无法正常工作。请帮助我
最佳答案
请检查此代码是否满足您的需求:
public boolean match (String filename, String partOfFileName) {
StringTokenizer st = new StringTokenizer(partOfFileName, "*");
if (st.hasMoreTokens()) {
String partialName = st.nextToken(); //get the first substring contained before an *
int index = filename.indexOf(partialName); //check if it is contained in your filename
if (index != -1) {
filename = filename.substring(index + partialName.length()); //if it's contained, cut the filename to check the rest of the string
partOfFileName = partOfFileName.substring(partOfFileName.indexOf(partialName) + partialName.length()); //cut the partOfFileName so you can get the next token
return match(filename, partOfFileName); //recursive call
} else {
return false;
}
}
return true;
}
我认为你不应该询问 * 的每个可能位置(结束、开始、中间),你只需要知道每个 * 之前的子字符串是否包含,无论它在哪里。
我用StringTokenizer获取 * 之间包含的子字符串(它将字符串分解为标记,使用接收到的字符作为参数,在我们的例子中为 *)。基本上我创建了 StringTokenizer,获取每个 * 之前的子字符串并检查它是否包含在完整字符串中:如果是这样,那么我剪切两个字符串(文件名和partOfFileName)并进行递归调用,如果不包含则返回 false。
让我知道是否可以。问候
关于java - 使用递归和通配符 (*) 在文件中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20295096/