2013-11-29 5 views
1

Я написал этот код для поиска файлов:рекурсивный поиск файлов с групповым символом (*), соответствующим

package filesearch; 

import java.io.File; 

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 (f.getAbsolutePath().contains(partOfFile)) { 
        System.out.println("File:" + f.getAbsoluteFile()); 
       } 
      } 
     } 
    } 

    public static void main(String[] args) { 
     FileSearch fw = new FileSearch(); 
     fw.walk("g:\\", "abs"); 
    } 
} 

Я хочу использовать подстановочные знаки (*). то если (*) является первым или последним символом шаблона можно реализовать, добавив следующий код:

if(f.getAbsolutePath().startsWith(partOfFile)){ 
    System.out.println("File:" + f.getAbsoluteFile()); 
} 
if(f.getAbsolutePath().endWith(partOfFile)){ 
    System.out.println("File:" + f.getAbsoluteFile()); 
} 

Как работать, когда у меня есть больше одного группового символа (*) и когда групповые символы (*) находятся в середине рисунка?

+0

конвертировать ваш шаблон в регулярное выражение. – Buddha

ответ

-1

Использование Files.newDirectoryStream (Path, String Glob)

Дополнительная информация: http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#newDirectoryStream(java.nio.file.Path, java.lang.String)

+0

Он не поддерживает больше, чем один \ * – Ehsan

+0

Да, он делает это: http://docs.oracle.com/javase/tutorial/essential/io/fileOps.html#glob –

+0

@BartEnkelaar Globs * do * поддерживает несколько * s , Однако newDirectoryStream выполняет только итерацию по данному каталогу. – Max

1

Попробуйте эту программу.

import java.io.File; 

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 
     { 
      boolean isFileMatched = isFileMatched(f, partOfFile); 
      if (isFileMatched) 
       System.out.println("File:" + f.getAbsoluteFile()); 
     } 
    } 
} 

private boolean isFileMatched(File file, String partOfFile) 
{ 
    boolean isMatched = true; 
    if (file == null || partOfFile == null) 
     return false; 

    String fileName = file.getName(); 

    //to ignore extension 
    if (fileName.contains(".")) 
     fileName = fileName.substring(0, fileName.lastIndexOf(".")); 

    String[] tokens = null; 
    if (partOfFile.contains("*")) 
    { 
     if (partOfFile.startsWith("*") && partOfFile.endsWith("*")) 
     { 
      tokens = partOfFile.split("\\*"); 
      isMatched = isTokenMatched(isMatched, fileName, tokens); 
     } 
     else if (partOfFile.startsWith("*")) 
     { 
      String suffix = partOfFile.substring(partOfFile.lastIndexOf("*") + 1); 
      if (fileName.endsWith(suffix)) 
      { 
       tokens = partOfFile.split("\\*"); 
       isMatched = isTokenMatched(isMatched, fileName, tokens); 
      } 
      else 
       isMatched = false; 
     } 
     else if (partOfFile.endsWith("*")) 
     { 
      String prefix = partOfFile.substring(0, partOfFile.indexOf("*")); 
      if (fileName.startsWith(prefix)) 
      { 
       tokens = partOfFile.split("\\*"); 
       isMatched = isTokenMatched(isMatched, fileName, tokens); 
      } 
      else 
       isMatched = false; 
     } 
     else 
     { 
      if (!fileName.equals(partOfFile)) 
       isMatched = false; 
     } 
    } 
    return isMatched; 
} 

private boolean isTokenMatched(boolean isMatched, String fileName, String[] tokens) 
{ 
    if (tokens != null) 
    { 
     for (String token : tokens) 
     { 
      if (!fileName.contains(token)) 
      { 
       isMatched = false; 
       break; 
      } 
     } 
    } 
    return isMatched; 
} 

public static void main(String[] args) 
{ 
    FileSearch fw = new FileSearch(); 
    fw.walk("g:\\" , "abs"); 
} 
} 
+0

Возможно, вы захотите добавить некоторое объяснение о том, как и почему это решение. – Mark

1

Есть много других способов, чтобы получить то, что вы хотите сделать, но преобразовать ваш шаблон с групповым символом в регулярном выражении является наиболее эффективным с точки зрения кодирования и readability.Just, как вы использовали StartsWith и ENDWITH, вы может использовать функцию совпадений и регулярное выражение, чтобы быстро проверить, что вы хотели.

Все, что вам нужно сделать, это заменить * в шаблоне с помощью .*?. Таким образом, ваш шаблон с шаблоном будет преобразован в не жадное регулярное выражение. Тогда просто нужно использовать функцию, чтобы проверить, существует ли шаблон в вашей строке. Ниже пример проверяет, есть ли * в середине. Этот подход будет работать с любым количеством подстановочных знаков.

partOfFile = ".*?"+partOfFile.replace("*",".*?")+".*?"; // fi*e.log becomes .*?fi.*e.log.*? 
if(f.getAbsolutePath().matches(partOfFile)) 
{ 
    System.out.println("File:" + f.getAbsoluteFile()); 
} 

Соответствие функции будет принимать регулярное выражение в качестве входного сигнала. Мы размещаем. *? до и после шаблона, чтобы гарантировать, что мы можем иметь некоторые символы до и после шаблона.

Смежные вопросы