2012-11-22 14 views
7

Muszę pobrać plik z katalogu plików PDF. Mam problem, że nie mam pola, aby zsumować wszystkie dane, aby znaleźć plik.Jak uzyskać plik z katalogu z wzorcem/filtrem

Oto przykład:

File name:

Comp_20120619_170310_2_632128_FC_A_8_23903.pdf 

Nazwa pliku generowania:

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

dont”mieć pole "--------" aby plik pełna nazwa.

Próbuję z File.list, ale nie mogę znaleźć prawidłowego pliku.

+0

I don 't wiem dużo java, ale co z "Comp_20120619 _ * _ 2_632128_FC_A_8_23903.pdf"? – Diego

+0

Myślałem o tym, ale to nie działa. Dzięki! – backLF

Odpowiedz

16

można zdefiniować FilenameFilter do meczu z nazwami i powrócić true, jeśli nazwa pliku pasuje do tego, co szukasz.

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"); 
     } 
    }); 

Metoda listFiles() zwraca tablicę obiektów File. Ma to sens, ponieważ może istnieć więcej niż jeden plik pasujący do wzorca (przynajmniej teoretycznie, choć niekoniecznie w twoim systemie).

Użyłem wyrażeń regularnych, aby dopasować nazwę pliku, używając [^_]* do dopasowania sekcji, której nie masz pewności. Można jednak użyć dowolnej funkcji, która zwróci wartość logiczną, jeśli nazwa pliku jest zgodna. Na przykład zamiast wyrażenia regularnego można użyć startsWith i endsWith.

+0

Dzięki Martin, próbuję użyć tego Regexp, powiem Ci wynik. Zbuduję dinamicznie pozostałe części nazwy pliku, na przykład: "Comp _" + data + "_ * _" + fbo.suc() + "_" + fbo.trans() + "_" + fbo.type() + "_" + fbo.letter() + "_" + fbo.pointvta() + "_" + fbo.ticketnumber() + ". pdf"; – backLF

+0

Pamiętaj, że jest to regex, a nie plik glob. Więc jeśli chcesz dopasować dowolny tekst, to ". *", A nie "*". Nie zapomnij dodać podkreśleń do swojego regex! –

+1

Należy także unikać kropek, ponieważ kropka w RegEx oznacza "dowolny znak". Powinno to być "Comp_20120619 _ [^ _] * _ 2_632128_FC_A_8_23903 \\. Pdf". (Potrzebne są dwa ukośniki odwrotne, ponieważ musisz również przestrzegać reguł ewakuacyjnych Java: dwa backslahes w dosłownym znaczeniu w łańcuchu) – Mene

1

Jaki jest twój problem z list()?

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

Mam problem z ustawionym filtrem, więc te metody zwracają różne pliki. – backLF

1

Możliwe tu użyć WildcardFileFilter (org.apache.commons.io.filefilter)

Kod wygląda prosta:

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

Nadzieja to działa ..

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

Proszę dodać wyjaśnienie do swojej odpowiedzi. – Mehraban

+0

listFiles z filtrem plików daje tylko pliki, które pasują do twoich kryteriów filtrowania.Tutaj wybieram tylko te pliki, których nazwa zaczyna się od wspomnianych kryteriów (przekazywanych jako parametr do metody getFileNameFilterMachingWithFileName ("Comp_20120619_")) i kończy się rozszerzeniem ".pdf", aby pobrać tylko pliki pdf. również jest porównywany w sposób niewrażliwy na wielkość liter, aby wybrać wszystkie pliki, nawet w systemie Linux, takim jak system operacyjny z rozróżnianiem wielkości liter. –

+0

Czy możesz umieścić swój komentarz w samej odpowiedzi? – Mehraban

Powiązane problemy