【问题标题】:Filter files using a wildcard character (java)使用通配符过滤文件(java)
【发布时间】:2012-10-05 09:54:12
【问题描述】:

使用通配符我想处理目录中的文件。如果指定了通配符,我想处理与通配符匹配的文件,否则如果未指定,我将处理所有文件。这是我的代码

   List<File> fileList;
   File folder = new File("Directory");
   File[] listOfFiles = folder.listFiles();
    if(prop.WILD_CARD!=null) {  
        Pattern wildCardPattern = Pattern.compile(".*"+prop.WILD_CARD+"(.*)?.csv",Pattern.CASE_INSENSITIVE);
        for(File file: listOfFiles) {
            Matcher match = wildCardPattern.matcher(file.getName());
            while(match.find()){
                String fileMatch = match.group();
                if(file.getName().equals(fileMatch))  {
                    fileList.add(file); // doesn't work
                }
            }
        }
    }
    else
        fileList = new LinkedList<File>( Arrays.asList(folder.listFiles()));

我无法将匹配通配符字符的文件放在单独的文件列表中。请帮助我修改我的代码,以便我可以将所有匹配通配符字符的文件放在单独的文件列表中。这里我在我的正则表达式中连接 prop.WILD_CARD,它可以是任何字符串,例如如果通配符是 test,我的模式是 .test(.)?.csv。并且我想存储匹配这个通配符的文件并存储在一个文件列表中。

【问题讨论】:

  • 我猜你的模式不正确。您必须显示您希望它匹配的模式和文件名
  • @IngoKegel 不,我的模式是正确的,它有效。 prop.WILD_CARD 可以是任何东西,例如,如果它的测试我的模式是 .*test(.*)?.csv。我想存储匹配此通配符的文件并将其存储在文件列表中
  • 首先是你的fileList没有初始化。第二种是在比较之前将file.getName()fileMatch 打印到控制台。
  • 您也不需要while (match.find()) 部分。可以换成if (match.matches()) fileList.add(file)
  • @svz 我做了比较和名字匹配

标签: java file wildcard


【解决方案1】:

我刚刚测试了这段代码,它运行得很好。您应该在其他地方检查逻辑错误。

    public static void main(String[] args) {

    String WILD_CARD = "";
     List<File> fileList = new LinkedList<File>();
       File folder = new File("d:\\");
       File[] listOfFiles = folder.listFiles();
        if(WILD_CARD!=null) {  
            Pattern wildCardPattern = Pattern.compile(".*"+WILD_CARD+"(.*)?.mpp",Pattern.CASE_INSENSITIVE);
            for(File file: listOfFiles) {
                Matcher match = wildCardPattern.matcher(file.getName());
                while(match.find()){
                    String fileMatch = match.group();
                    if(file.getName().equals(fileMatch))  {
                        fileList.add(file); // doesn't work
                    }
                }
            }
        }
        else
            fileList = new LinkedList<File>( Arrays.asList(folder.listFiles()));

        for (File f: fileList) System.out.println(f.getName());
}

这将返回我的D: 驱动器上所有 *.mpp 文件的列表。

我也建议使用

        for (File file : listOfFiles) {
            Matcher match = wildCardPattern.matcher(file.getName());
            if (match.matches()) {
                fileList.add(file);
            }
        }

【讨论】:

  • 对我也有用!!!问题是我一开始没有初始化 fileList,正如你建议的那样,我使用了 if 而不是 while。谢谢
【解决方案2】:

我建议您查看 FilenameFilter 类,看看它是否有助于简化您的代码。至于您的正则表达式,我认为您需要转义“。”让它工作的字符。

【讨论】:

  • 其实我的正则表达式没有问题,唯一的问题是我不知道如何将匹配的文件放在单独的文件列表中。
猜你喜欢
  • 2017-09-09
  • 1970-01-01
  • 2015-04-16
  • 2015-08-28
  • 2021-11-12
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多