2012-11-22 19 views
7

PDFファイルディレクトリからファイルを取得する必要があります。ファイルを見つけるためにすべてのデータを統合するフィールドがないという問題があります。パターン/フィルターでディレクトリからファイルを取得する方法

ファイル名:

Comp_20120619_170310_2_632128_FC_A_8_23903.pdf 

ファイル名を生成します。私は、ファイル完全な名前を作成するフィールド"--------"を持っている「いけない

Comp_20120619_--------_2_632128_FC_A_8_23903.pdf 

は、ここでの例です。

私はFile.listで試していますが、正しいファイルが見つかりません。

+0

Iドン多くのJavaを知りませんが、 "Comp_20120619 _ * _ 2_632128_FC_A_8_23903.pdf"についてはどうですか? – Diego

+0

私はこれらを考えましたが、動作しません。ありがとう! – backLF

答えて

16

あなたはファイル名にマッチさせるFilenameFilterを定義し、ファイル名は、あなたが探しているものと一致する場合はtrueを返すことができます。

File dir = new File("/path/to/pdfs"); 
    File[] files = dir.listFiles(new FilenameFilter() { 
     @Override 
     public boolean accept(File dir, String name) { 
      return name.matches("Comp_20120619_[^_]*_2_632128_FC_A_8_23903.pdf"); 
     } 
    }); 

listFiles()メソッドは、Fileオブジェクトの配列を返します。これはパターンに一致するファイルが複数ある可能性があるためです(理論的には少なくともシステム内にあるとは限りませんが)。

ファイル名に一致する正規表現を使用しました。確信がない部分に一致するように[^_]*を使用しています。ただし、ファイル名が一致する場合はbooleanを返す関数を使用できます。たとえば、正規表現の代わりにstartsWithendsWithを使用できます。

+0

ありがとうマーティン、私はこのRegexpを使用しようとしています、私は結果を教えてくれるでしょう。 "comp _" + date + "_ * _" + fbo.suc()+ "_" + fbo.trans()+ "_" + fbo.type()+など、ファイル名の他の部分をdinamicallyビルドします。 "_" + fbo.letter()+ "_" + fbo.pointvta()+ "_" + fbo.ticketnumber()+ ".pdf"; – backLF

+0

これは正規表現であり、ファイルグロブではないことに注意してください。したがって、任意のテキストに一致させたい場合は、 "*"ではなく "*"です。あなたの正規表現にもアンダースコアを追加することを忘れないでください! –

+1

また、RegExのドットは「任意の文字」を意味するため、ドットをエスケープする必要があります。したがって、 "Comp_20120619 _ [^ _] * _ 2_632128_FC_A_8_23903 \\。pdf"である必要があります。 (2つのバックスラッシュは、Javaのエスケープルールに従う必要があるため、2つのバックスラッシュが必要です。文字列のリテラルを意味します) – Mene

1

list()で問題が発生しましたか?

File folder = new File("path/to/pdffilefolder"); 
String[] allFilesInThatFolder = folder.list(); 
// contains only files, no folders. 
+0

フィルタに問題があり、これらのメソッドは異なるファイルを返します。 – backLF

1

ことが可能TUが、コードは単純に見えます

WildcardFileFilter(org.apache.commons.io.filefilter)を使用します..

FilenameFilter filenameFilter = new WildcardFileFilter("Comp_20120619_*_2_632128_FC_A_8_23903.pdf"); 
String[] pdfFileNames = yourDir.list(filenameFilter); 
if(pdfFileNames != null) { 
    for (String pdfName : pdfFileNames) 
1

は、それが動作ホープ

String[] pdfFiles= yourDir.listFiles(getFileNameFilterMachingWithFileName("Comp_20120619_")); 



private FilenameFilter getFileNameFilterMachingWithFileName(final String 
fileNameStart) { 
     return new FilenameFilter() { 
      @Override 
      public boolean accept(File dir, String name) { 
       return (name.toUpperCase().startsWith(fileNameStart.toUpperCase()) && name.toUpperCase().endsWith(".PDF"));   
      } 
     }; 
    } 
+0

あなたの答えにいくつかの説明を加えてください。 – Mehraban

+0

ファイル名filterのlistFilesは、フィルタリング条件に一致するファイルのみを表示します。ここでは、名前が上記の基準(メソッドgetFileNameFilterMachingWithFileName( "Comp_20120619_")へのパラメータとして渡される)から始まり、 "pdf"拡張子で終わるファイルだけをピックアップしています。大文字と小文字を区別したファイルシステムを持つOSのようなLinuxでもすべてのファイルを選択するように、これは大文字と小文字を区別しない方法で比較されます。 –

+0

あなたはあなた自身のコメントを答えに入れることができますか? – Mehraban

関連する問題