दिलचस्प पोस्ट
2 एंड्रॉइड ऐप्स के बीच SQLite डेटाबेस साझा करें? HTML इनपुट = "फ़ाइल" विशेषता फ़ाइल प्रकार स्वीकार करें (CSV) मैं PHP में कंसोल को कैसे लिख सकता हूं? क्यूटी में मेमोरी प्रबंधन? जांचें कि कोई स्ट्रिंग palindrome है कैसे "अगर" जंजीरों से बचने के लिए? सभी के बारे में … Z- सूचकांक? मेमोरीस्ट्रीम रिस्पांस ऑब्जेक्ट को लिखना एक जावा सरणी को परिवर्तित करना एक जावास्क्रिप्ट सरणी के लिए स्ट्रिंग्स की सूची HTML5 वीडियो तत्व चल रहा है या नहीं std :: स्ट्रिंग लंबाई () और आकार () सदस्य फ़ंक्शन Base64 स्ट्रिंग को अर्रेबफर पर कनवर्ट करें स्विफ्ट में दृश्य नियंत्रकों और अन्य ऑब्जेक्ट्स के बीच डेटा कैसे साझा करते हैं? सभी पोर्ट पर सी # नेट त्रुटियों के माध्यम से GMail SMTP जावास्क्रिप्ट और वीबीएसपीटी के अलावा क्या क्लाइंट-साइड वेब स्क्रिप्टिंग भाषाएं हैं?

जावा में वाइल्डकार्ड स्ट्रिंग से मेल खाने वाली फ़ाइलों को कैसे खोजें?

यह वास्तव में सरल होना चाहिए अगर मेरे पास इस तरह स्ट्रिंग है:

../Test?/sample*.txt 

तो इस पद्धति से मेल खाने वाली फ़ाइलों की सूची प्राप्त करने का आम तौर पर स्वीकार किया गया तरीका क्या है? (जैसे यह मैच होना चाहिए ../Test1/sample22b.txt और ../Test4/sample-spiffy.txt लेकिन नहीं ../Test3/sample2.blah या ../Test44/sample2.txt )

मैंने org.apache.commons.io.filefilter.WildcardFileFilter पर एक नज़र लिया है और यह सही जानवर की तरह लगता है, लेकिन मुझे यकीन नहीं है कि किसी रिश्तेदार निर्देशिका पथ में फ़ाइलों को खोजने के लिए इसका उपयोग कैसे करें।

मुझे लगता है कि मैं चींटी के लिए स्रोत देख सकता हूँ क्योंकि यह वाइल्डकार्ड वाक्यविन्यास का उपयोग करता है, लेकिन मुझे कुछ बहुत स्पष्ट रूप से गायब होना चाहिए

( संपादित करें : उपरोक्त उदाहरण सिर्फ एक नमूना मामला था.मैं रनटाइम पर वाइल्डकार्ड वाले सामान्य पथ को पार्स करने के तरीके की तलाश कर रहा हूं। मुझे पता चला है कि यह कैसे mmyers के सुझाव पर आधारित है लेकिन यह कष्टप्रद है। जावा जेआरई एक वार्मिंग से मुख्य वाइल्डकार्ड को स्वत: पार्स करने के लिए एक तर्क से समय और परेशानी को बचाने के लिए लगता है … मुझे सिर्फ खुशी है कि मेरे पास गैर-फाइल तर्क नहीं है मिश्रण।)

Solutions Collecting From Web of "जावा में वाइल्डकार्ड स्ट्रिंग से मेल खाने वाली फ़ाइलों को कैसे खोजें?"

अपाचे चींटी से DirectoryScanner पर विचार करें:

 DirectoryScanner scanner = new DirectoryScanner(); scanner.setIncludes(new String[]{"**/*.java"}); scanner.setBasedir("C:/Temp"); scanner.setCaseSensitive(false); scanner.scan(); String[] files = scanner.getIncludedFiles(); 

आपको ant.jar को संदर्भित करना होगा (~ 1.7.1 के लिए 1.3 एमबी)।

मैं आमतौर पर अपाचे कॉमन्स-आईओ ( listFiles और iterateFiles विधियों) से FileUtils उपयोग करता FileUtils । आमतौर पर कोड कुछ ऐसा दिखता है:

 File dir = new File("."); FileFilter fileFilter = new WildcardFileFilter("sample*.java"); File[] files = dir.listFiles(fileFilter); for (int i = 0; i < files.length; i++) { System.out.println(files[i]); } 

TestX फ़ोल्डर्स के साथ अपनी समस्या को हल करने के लिए, मैं सबसे पहले फ़ोल्डरों की सूची के माध्यम से TestX हूं:

 File[] dirs = new File(".").listFiles(new WildcardFileFilter("Test*.java"); for (int i=0; i<dirs.length; i++) { File dir = dirs[i]; if (dir.isDirectory()) { File[] files = dir.listFiles(new WildcardFileFilter("sample*.java")); } } 

काफी 'ब्रूट बल' समाधान पर ठीक से काम करना चाहिए। यदि यह आपकी आवश्यकताओं के अनुरूप नहीं है, तो आप हमेशा RegexFileFilter का उपयोग कर सकते हैं

यहां जावा 7 निओ ग्लोबबींग और जावा 8 लैम्ब्डा द्वारा संचालित पैटर्न के अनुसार फाइलें सूचीबद्ध करने के उदाहरण दिए गए हैं:

  try (DirectoryStream<Path> dirStream = Files.newDirectoryStream( Paths.get(".."), "Test?/sample*.txt")) { dirStream.forEach(path -> System.out.println(path)); } 

या

  PathMatcher pathMatcher = FileSystems.getDefault() .getPathMatcher("regex:Test.[\\/]sample\\w+\\.txt"); try (DirectoryStream<Path> dirStream = Files.newDirectoryStream( new File("..").toPath(), pathMatcher::matches)) { dirStream.forEach(path -> System.out.println(path)); } 

आप अपनी वाइल्डकार्ड स्ट्रिंग को एक नियमित अभिव्यक्ति में कनवर्ट कर सकते हैं और इसका उपयोग स्ट्रिंग के matches विधि के साथ कर सकते हैं। अपने उदाहरण के बाद:

 String original = "../Test?/sample*.txt"; String regex = original.replace("?", ".?").replace("*", ".*?"); 

यह आपके उदाहरणों के लिए काम करता है:

 Assert.assertTrue("../Test1/sample22b.txt".matches(regex)); Assert.assertTrue("../Test4/sample-spiffy.txt".matches(regex)); 

और काउंटर-उदाहरण:

 Assert.assertTrue(!"../Test3/sample2.blah".matches(regex)); Assert.assertTrue(!"../Test44/sample2.txt".matches(regex)); 

अभी आपकी सहायता नहीं कर सकते, लेकिन जेडीके 7 का उद्देश्य "अधिक एनआईओ सुविधाओं" के भाग के रूप में ग्लोब और रेगेक्स फ़ाइल नाम मिलान करना है।

वाइल्डकार्ड पुस्तकालय कुशलता से दोनों ग्लोब और regex फ़ाइलनाम मिलान करता है:

http://code.google.com/p/wildcard/

कार्यान्वयन संक्षिप्त है – जार केवल 12.9 किलोबाइट है

जावा 8 के बाद से आप java.nio.file से सीधे Files#find विधि का उपयोग कर सकते हैं।

 public static Stream<Path> find(Path start, int maxDepth, BiPredicate<Path, BasicFileAttributes> matcher, FileVisitOption... options) 

उदाहरण उपयोग

 Files.find(startingPath, Integer.MAX_VALUE, (path, basicFileAttributes) -> path.toFile().getName().matches(".*.pom") ); 

किसी भी बाह्य आयात का उपयोग किए बिना सरल रास्ता इस पद्धति का उपयोग करना है

मैंने billing_201208.csv, billing_201209.csv, billing_201210.csv नामक सीएसवी फाइलों को बनाया है और यह ठीक काम करने जैसा दिखता है।

उपरोक्त सूचीबद्ध फाइल मौजूद होने पर आउटपुट निम्न होंगे

 found billing_201208.csv found billing_201209.csv found billing_201210.csv 

     // आयात का आयात करें -> आयात करें java.io.File
         सार्वजनिक स्थैतिक शून्य main (String [] args) {
         स्ट्रिंग pathToScan = "।";
         स्ट्रिंग लक्ष्य_फ़ाइल;  // fileThatYouWantToFilter
         फ़ाइल फ़ोल्डरटॉस्केन = नया फ़ाइल (पथटॉस्केन); 

  File[] listOfFiles = folderToScan.listFiles(); for (int i = 0; i < listOfFiles.length; i++) { if (listOfFiles[i].isFile()) { target_file = listOfFiles[i].getName(); if (target_file.startsWith("billing") && target_file.endsWith(".csv")) { //You can add these files to fileList by using "list.add" here System.out.println("found" + " " + target_file); } } } } 

जैसा कि एक और जवाब में पोस्ट किया गया है, वाइल्डकार्ड पुस्तकालय दोनों ग्लोब और regex फ़ाइलनाम मिलान के लिए काम करता है: http://code.google.com/p/wildcard/

मैं * निकस शैली फ़ाइल सिस्टम पर पूर्ण और रिश्तेदार सहित ग्लोब पैटर्न से मेल करने के लिए निम्न कोड का उपयोग किया:

 String filePattern = String baseDir = "./"; // If absolute path. TODO handle windows absolute path? if (filePattern.charAt(0) == File.separatorChar) { baseDir = File.separator; filePattern = filePattern.substring(1); } Paths paths = new Paths(baseDir, filePattern); List files = paths.getFiles(); 

मैंने कुछ समय बिताया है कि आप अपाचे कॉमन्स io लाइब्रेरी में फ़ाइल यूटीएल .फ़ाइलों के तरीके (व्लादिमीर के जवाब देखें) को प्राप्त करने की कोशिश कर रहे हैं, लेकिन कोई सफलता नहीं मिली (अब मुझे पता है / लगता है कि यह केवल एक समय में एक निर्देशिका या फाइल से मेल खाते का संचालन कर सकता है) ।

इसके अतिरिक्त, रेगएक्स फिल्टर का उपयोग करते हुए (फैबियन के जवाब को देखें) पूरी तरह से फ़ाइल सिस्टम को खोज किए बिना पूर्णतया प्रकार के ग्लोब पैटर्न प्रदान करने वाले उपयोगकर्ता को प्रसंस्करण के लिए सबसे बड़ा गैर-रेगेक्स / ग्लोब उपसर्ग निर्धारित करने के लिए आपूर्ति की गई ग्लोब के कुछ प्रीप्रोसेसिंग की आवश्यकता होगी।

ज़ाहिर है, जावा 7 अनुरोधित कार्यक्षमता को अच्छी तरह से संभाल सकता है, लेकिन दुर्भाग्य से मैं अभी के लिए जावा 6 के साथ फँस गया हूँ। पुस्तकालय 13.5kb आकार में अपेक्षाकृत कम है।

समीक्षकों के लिए ध्यान दें: मैंने उपरोक्त मौजूदा उत्तर में इस पुस्तकालय का उल्लेख करने का प्रयास किया, लेकिन संपादन को अस्वीकार कर दिया गया। मेरे पास एक टिप्पणी के रूप में जोड़ने के लिए पर्याप्त प्रतिनिधि नहीं है क्या कोई बेहतर तरीका नहीं है …

आप WildcardFileFilter का उपयोग करने में सक्षम होना चाहिए। बस कार्यशील निर्देशिका पाने के लिए System.getProperty("user.dir") का उपयोग करें। इसे इस्तेमाल करे:

 public static void main(String[] args) { File[] files = (new File(System.getProperty("user.dir"))).listFiles(new WildcardFileFilter(args)); //... } 

आपको * [.*] साथ * बदलने की आवश्यकता नहीं होगी, मान लें वाइल्डकार्ड फ़िल्टर का उपयोग java.regex.Pattern मैंने इसका परीक्षण नहीं किया है, लेकिन मैं लगातार पैटर्न और फाइल फिल्टर का इस्तेमाल करता हूं

अपाचे फ़िल्टर ज्ञात निर्देशिका में फ़ाइलों को पुनरावृति करने के लिए बनाया गया है। डायरेक्टरी में वाइल्डकार्ड को भी अनुमति देने के लिए, आपको ' \ ' या ' / ' पर पथ को विभाजित करना होगा और प्रत्येक भाग पर एक फिल्टर अलग से करना होगा।

जावा 7 का ग्लोब : फ़ाइलें ढूँढना ( नमूना )

ऐसा क्यों न करें:

 File myRelativeDir = new File("../../foo"); String fullPath = myRelativeDir.getCanonicalPath(); Sting wildCard = fullPath + File.separator + "*.txt"; // now you have a fully qualified path 

तो आपको रिश्तेदार रास्ते के बारे में चिंता करने की ज़रूरत नहीं होगी और जरूरत पड़ने पर आपकी जंगली सुरक्षा भी कर सकती है।

जेडीके फ़ाइल विजिटर इंटरफेस लागू करें। यहां एक उदाहरण है http://wilddiary.com/list-files-matching-a-naming-pattern-java/

उपयोगिता विधि:

 public static boolean isFileMatchTargetFilePattern(final File f, final String targetPattern) { String regex = targetPattern.replace(".", "\\."); //escape the dot first regex = regex.replace("?", ".?").replace("*", ".*"); return f.getName().matches(regex); } 

ज्युनिट टेस्ट:

 @Test public void testIsFileMatchTargetFilePattern() { String dir = "D:\\repository\\org\my\\modules\\mobile\\mobile-web\\b1605.0.1"; String[] regexPatterns = new String[] {"_*.repositories", "*.pom", "*-b1605.0.1*","*-b1605.0.1", "mobile*"}; File fDir = new File(dir); File[] files = fDir.listFiles(); for (String regexPattern : regexPatterns) { System.out.println("match pattern [" + regexPattern + "]:"); for (File file : files) { System.out.println("\t" + file.getName() + " matches:" + FileUtils.isFileMatchTargetFilePattern(file, regexPattern)); } } } 

आउटपुट:

 match pattern [_*.repositories]: mobile-web-b1605.0.1.pom matches:false mobile-web-b1605.0.1.war matches:false _remote.repositories matches:true match pattern [*.pom]: mobile-web-b1605.0.1.pom matches:true mobile-web-b1605.0.1.war matches:false _remote.repositories matches:false match pattern [*-b1605.0.1*]: mobile-web-b1605.0.1.pom matches:true mobile-web-b1605.0.1.war matches:true _remote.repositories matches:false match pattern [*-b1605.0.1]: mobile-web-b1605.0.1.pom matches:false mobile-web-b1605.0.1.war matches:false _remote.repositories matches:false match pattern [mobile*]: mobile-web-b1605.0.1.pom matches:true mobile-web-b1605.0.1.war matches:true _remote.repositories matches:false