2010-11-10 12 views
5

मैं जावा का उपयोग कर विंडोज संस्करण के लिए डेस्कटॉप एप्लिकेशन में काम कर रहा हूं। मेरे आवेदन में स्थानीय सिस्टम से MyDocuments/दस्तावेज़ (ओएस के अनुसार) से सभी .doc और .docx फ़ाइलों को खोजने की आवश्यकता है और वहां नाम और फ़ाइल आकार प्रदर्शित करें।जावा कोड स्थानीय सिस्टम से सभी .doc और .docx फ़ाइलों को खोजने के लिए

मुझे ऐसा तरीका नहीं मिल रहा है जो मुझे सभी * .doc, * .docx, * .xls, * .xlsx, * .csv, * .txt, * .pdf, * .ppt को सूचीबद्ध करने में मदद करेगा। , * .pptx फ़ाइलें दस्तावेज़/MyDocuments में मौजूद हैं।

कृपया मुझे अपने मूल्यवान सुझाव दें या मुझे कोई लिंक दें जो मुझे तेजी से खोज और नाम, आकार और प्रकार के साथ सूचीबद्ध करने के लिए कोड लिखने में मदद करेगा।

उत्तर

8

आप विशेष रूप से FileUtils कक्षा में अपाचे कॉमन्स आईओ का उपयोग कर सकते हैं।

import java.io.File; 
import java.util.Collection; 

import org.apache.commons.io.*; 
import org.apache.commons.io.filefilter.*; 

public class SearchDocFiles { 
    public static String[] EXTENSIONS = { "doc", "docx" }; 

    public Collection<File> searchFilesWithExtensions(final File directory, final String[] extensions) { 
     return FileUtils.listFiles(directory, 
       extensions, 
       true); 
    } 

    public Collection<File> searchFilesWithCaseInsensitiveExtensions(final File directory, final String[] extensions) { 
     IOFileFilter fileFilter = new SuffixFileFilter(extensions, IOCase.INSENSITIVE); 
     return FileUtils.listFiles(directory, 
       fileFilter, 
       DirectoryFileFilter.INSTANCE); 
    } 


    public static void main(String... args) { 
     // Case sensitive 
     Collection<File> documents = new SearchDocFiles().searchFilesWithExtensions(
       new File("/tmp"), 
       SearchDocFiles.EXTENSIONS); 
     for (File document: documents) { 
      System.out.println(document.getName() + " - " + document.length()); 
     } 

     // Case insensitive 
     Collection<File> caseInsensitiveDocs = new SearchDocFiles().searchFilesWithCaseInsensitiveExtensions(
       new File("/tmp"), 
       SearchDocFiles.EXTENSIONS); 
     for (File document: caseInsensitiveDocs) { 
      System.out.println(document.getName() + " - " + document.length()); 
     } 
    } 
} 
+0

मुझे यकीन नहीं है कि इसे "test.DOC" जैसी फ़ाइलें मिलेंगी ... – khachik

+0

@khachik आप अनदेखा कर सकते हैं या ऊपरी/निचले मामले की आपको आवश्यकता है। –

0

आप Apache POI का उपयोग कर MSWord पाठ निकालने और Lucene के माध्यम से उन्हें का अनुक्रमण (सटीकता, लचीलापन, और खोज की गति के लिए) पर गौर कर सकते हैं। नच और सोलर दोनों में ल्यूसीन के लिए सहायक पुस्तकालय हैं जिनका उपयोग आप चीजों को गति देने के लिए कर सकते हैं (यानी यदि ल्यूसीन कोर पर्याप्त नहीं है)।

[अपडेट] मैंने मूल प्रश्न (अद्यतन से पहले) को गलत समझा है। आपको जावा का उपयोग कर फाइल सिस्टम खोजना होगा ?? जावा एपीआई ऐसा कर सकता है। अपाचे में library (Commons IO) भी है जिसमें एक निर्देशिका के तहत सभी फाइलों को सूचीबद्ध करने के लिए एक फ़ाइल उपयोगिता शामिल है जिसमें इसकी उपनिर्देशिकाएं फ़िल्टर प्रदान करती हैं। मैंने इसे पहले इस्तेमाल किया है, उदाहरण के लिए FileUtils.listFiles (dir, filefilter, dirfilter) या FileUtils.listFiles (dir, एक्सटेंशन [], रिकर्सिव)। फिर उस सूची से अपना खोज फ़ंक्शन करें।

1

आप .doc साथ सभी फ़ाइलों को खोजने के लिए चाहते हैं (एक्स) एक्सटेंशन, आप कर सकते हैं का उपयोग java.io.File.list (FileFilter) विधि, का कहना है:

 
public java.util.List mswordFiles(java.io.File dir) { 
    java.util.List res = new java.util.ArrayList(); 
    _mswordFiles(dir, res); 
    return res; 
} 
protected void _mswordFiles(java.io.File dir, java.util.List res) { 
    java.io.File [] files = dir.listFiles(new java.io.FileFilter() { 
     public boolean accept(java.io.File f) { 
      String name = f.getName().toLowerCase(); 
      return !f.isDirectory() && (name.endsWith(".doc") || name.endsWith(".docx")); 
     } 
    }); 
    for(java.io.File f:files) {res.add(f);} 
    java.io.File [] dirs = dir.listFiles(new java.io.FileFilter() { 
     public boolean accept(java.io.File f) { 
      return f.isDirectory(); 
     } 
     }); 
    for(java.io.File d:dirs) {_mswordFiles(d, res);} 
} 

ऐसा ही कुछ देना होगा
2

इस विधि को चेक करें।

public void getFiles(String path) { 
    File dir = new File(path); 
    String[] children = dir.list(); 
    if (children != null) { 
     for (int i = 0; i < children.length; i++) { 
      // Get filename of file or directory 
      String filename = children[i]; 
      File file = new File(path + File.separator + filename); 
      if (!file.isDirectory()) { 
       if (file.getName().endsWith(".doc") || file.getName().endsWith(".docx")) { 
        System.out.println("File Name " + filename + "(" + file.length()+" bytes)"); 
       } 
      } else { 
       getFiles(path + File.separator + filename); 
      } 
     } 
    } 
} 
1

मैं तो टिप्पणी करने के लिए एक 'जवाब' के रूप में इस प्रस्तुत करना पर्याप्त प्रतिष्ठा नहीं है:

@khachik आप ignoreCase या ऊपरी/निचले मामले के रूप में आप की जरूरत । - मार्टिन Verburg नवंबर 10 '10 12:02

पर यह मैं थोड़ा ले लिया यह पता लगाने की और अंत में पाया है कि कैसे इस समाधान के साथ मामले की अनदेखी करने के:

जोड़े

public static final IOFileFilter filter = new SuffixFileFilter(EXTENSIONS, IOCase.INSENSITIVE);

फिर searchFilesWithExtensions विधि return FileUtils.listFiles( directory, filter, DirectoryFileFilter.DIRECTORY);

संबंधित मुद्दे