使用递归和通配符(*)在文件中搜索

时间:2013-11-30 00:24:26

标签: java recursion wildcard

我编写了这段代码来搜索路径文件中的递归和实现支持多个的通配符(*)。

我的代码在这里:

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);

    }    
}

但是当我在执行中使用多个(*)时,它无法正常工作。请帮帮我

1 个答案:

答案 0 :(得分:1)

请检查此代码是否符合您的需求:

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,在每个*之前获取子字符串并检查它是否包含在完整字符串中:如果那样,那么我剪切了两个字符串(filename和partOfFileName)并进行递归调用,如果它&#39 ; s不包含然后返回false。
如果可以,请告诉我。此致