2012-10-05 47 views
0

使用通配符我想处理目录中的文件。如果指定了通配符,我想处理那些匹配通配符字符的文件,如果未指定,我将处理所有文件。这里是我的代码使用通配符(java)过滤文件

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,它可以是任何字符串,例如如果通配符是测试,我的模式是。 测试(。)?。csv。我想存储与此通配符匹配的文件并将其存储在文件列表中。

+0

我猜你的模式是不正确的。你必须显示你期望它匹配的模式和文件名 –

+0

@IngoKegel没有我的模式是正确的,它的工作原理。如果测试我的模式是。* test(。*)?.csv,prop.WILD_CARD可以是任何东西。我想存储与此通配符匹配的文件并将其存储在文件列表中 –

+0

第一件事是您的'fileList'未初始化。第二个是在比较之前将'file.getName()'和'fileMatch'输出到控制台。 – svz

回答

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); 
      } 
     } 
+0

适合我!问题是我没有在开始时初始化fileList,并且正如你所建议的那样,如果使用while而不是while。谢谢 –

0

我建议你看看FilenameFilter类,看看它是否有助于简化你的代码。至于你的正则表达式,我认为你需要逃避“。”它的工作性质。

+0

其实我没有概率与我的正则表达式,唯一的事情是我没有知道如何将匹配的文件放在单独的文件列表中。 –