2016-04-11 2 views
1

ルートディレクトリとルート内のサブディレクトリから配列内のファイルのリストを取得しようとしています。 C:\を私のルートディレクトリとみなしてください。私はまた、ファイル名の特定のパターンに従ってC:\abcC:\defのリストを取得したいと思います。ここで私が試したコードです。1つの文字列配列のサブディレクトリにあるファイルを取得するためのネストされたaccept()

public String[] getFilesList(File path){ 
     String[] filesList = null; 
     final String[] directories = null; 
     try { 
      properties.load(new StoricoPV_ISAU().getFile()); 
     } catch (IOException e) { 
      log.error(e.getMessage()); 
      e.printStackTrace(); 
     } 
     filesList = path.list(new FilenameFilter() { 
      public boolean accept(File dir, String name) { 
       if(name.matches(Constants.INTERNA_REGEX)){ 
        return true; 
       }else if(name.matches(Constants.SISS_REGEX)){ 
        return true; 
       }else if(new File(properties.getProperty(Constants.PATH_NAME)+name).isDirectory()){ 
        //error here: The final local variable directories cannot be assigned, since it is defined in an enclosing type 
        directories = new File(properties.getProperty(Constants.PATH_NAME)).list(new FilenameFilter() { 
         public boolean accept(File dir, String name) { 
          if(name.matches(Constants.INTERNA_REGEX)){ 
           return true; 
          }else if(name.matches(Constants.SISS_REGEX)){ 
           return true; 
          }else{ 
           log.info("Invalid file or directory: "+name); 
           return false; 
          } 
         } 
        }); 

        return false; 
       } 
       return false; 
      } 
     }); 

     return filesList; 
    } 

さて、私は、変数directoriesfinalすることができないことを知っているが、同時に、それはこのメソッドの内部で動作するようにfinalする必要があります。最終的にC:\C:\abcおよびC:\defのすべてのファイルのリストが、指定されたファイルパターンに従って変数filesListに返されるように、私のロジックを変更するにはどうすればよいですか?これに関する助けは本当に感謝しています。

注:ディレクトリ内のレベル1の深さを超える必要はありません。たとえば、ディレクトリ内の任意のディレクトリを無視する必要がありますC:\abc

答えて

1

最初のことは再帰です。あなたはレベルのフォルダしか必要としないので、要件を変更する場合には、それを制御する変数を追加します。

public String[] getFilesList(File path) { 
    int deepth = 1; // Control the deepth of recursion 
    List<String> list = new ArrayList<String>(); 
    getFilesList(path, list, deepth); 
    return list.toArray(new String[list.size()]); 
} 

public void getFilesList(File path, final List<String> list, int deepth) { 
    if (deepth >= 0) { 
     final int newDeepth = deepth - 1; 
     String[] subList = path.list(new FilenameFilter() { 

     @Override 
     public boolean accept(File dir, String name) { 
      File subFile = new File(dir.getAbsolutePath() + "/" + name); 
      if (subFile.isFile()) { 
       if (name.matches(Constants.INTERNA_REGEX)) { 
       return true; 
      } else if (name.matches(Constants.SISS_REGEX)) { 
       return true; 
      } else { 
       // log.info("Invalid file or directory: " + name); 
       return false; 
      } 
     } else { 
      getFilesList(subFile, list, newDeepth); 
     } 
     return false; 
     } 
    }); 

    list.addAll(Arrays.asList(subList)); 
    } 
} 
+0

コードフォーマットに問題があったようですが、残念です。 –

+0

私は答えが好きです!それはかなり問題を解決します!ありがとうございました。 :) –

1

これらのような簡単なものを使用できませんか?あなたが望むように見えるように、それは(正規表現とフォルダの最初のレベルのみをマッチング)フィルタだけのファイル名を返します。ここでは

public static void main(String[] args) { 
    List<String> fileNames = new ArrayList<>(); 
    File source = new File("C:\\Users\\mofh\\Desktop\\test"); 
    getFiles(fileNames, source, source); 
} 


public static void getFiles(List<String> fileNames, File dir, File parent) { 
    try { 
     File[] files = dir.listFiles(); 
     for (File file : files) { 
      if (file.isDirectory()) { 
       if (!file.getAbsolutePath().equals(parent.getAbsolutePath()) && 
         file.getParent().equals(parent.getAbsolutePath())) { 
        getFiles(fileNames, file, dir); 
       } 
      } else { 
       if (file.getName().matches(Constants.INTERNA_REGEX) || 
         file.getName().matches(Constants.SISS_REGEX)) { 
        fileNames.add(file.getCanonicalPath()); 
       } 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

ありがとうございました。私にはボトルネックがあり、それは記憶です。私はこのディレクトリに8000以上のファイルを持っているので、ファイルの名前だけを取得しようとします。ファイル自体は取得しません。私はまた私のパターンと一致しないファイルを拒否したいので、最終的に取得するファイルのリストを減らすことができます。私はちょうど長いコードを書いたが、今はうまくいく。解決していただきありがとうございます:) –

0

は私が思い付いたものです。代わりに(listFiles()メソッドを使用して)ファイルのリストを取得できません。ファイルがたくさんあるためです。

public String[] getFilesList(File path){ 
     String[] filesList = null; 
     final List<String> directories = new ArrayList<String>(); 
     try { 
      properties.load(new StoricoPV_ISAU().getFile()); 
     } catch (IOException e) { 
      log.error(e.getMessage()); 
      e.printStackTrace(); 
     } 
     filesList = path.list(new FilenameFilter() { 
      public boolean accept(File dir, String name) { 
       if(name.matches(Constants.INTERNA_REGEX)){ 
        return true; 
       }else if(name.matches(Constants.SISS_REGEX)){ 
        return true; 
       }else if(new File(properties.getProperty(Constants.PATH_NAME)+name).isDirectory()){ 
        directories.add(properties.getProperty(Constants.PATH_NAME)+name); 
        return false; 
       } 
       return false; 
      } 
     }); 
     String[] tempList = null; 
     for(String directory :directories){ 
      tempList = new File(directory).list(new FilenameFilter() { 
      public boolean accept(File dir, String name) { 
       if(name.matches(Constants.INTERNA_REGEX)){ 
        return true; 
       }else if(name.matches(Constants.SISS_REGEX)){ 
        return true; 
       }else if(new File(properties.getProperty(Constants.PATH_NAME)+name).isDirectory()){ 
        log.info("Invalid file or directory name"); 
        return false; 
       } 
       return false; 
      } 
     }); 
      filesList = (String[])ArrayUtils.addAll(filesList, tempList); 
     } 

     return filesList; 
    } 
関連する問題