2012-02-05 4 views
15

मैं से the documentation and examplesमैं कैसे JDK7

मैं

Files.walkFileTree(startingDir, finder); 

उदाहरण के साथ काम करने के लिए इस तरह के रूप में "glob:*.dat" globs प्राप्त कर सकते हैं शुरू करने, JDK7 में नए ग्लोबिंग सुविधा का उपयोग करने की कोशिश कर रहा है में ग्लोबिंग निर्देशिका का उपयोग करना लेकिन मैं "**" सिंटैक्स काम करने में असमर्थ रहा हूं। मैं कुछ ऐसा बनाने में सक्षम होना चाहूंगा:

matcher = FileSystems.getDefault().getPathMatcher("glob:" + "foo/**/bar/*.dat"); 

और एक साधारण उदाहरण के लिए आभारी होंगे। मैं विंडोज 7 का उपयोग कर रहा हूं।

अद्यतन: @ ओलेग और @ जेबीनिज़ेट यह स्पष्ट करते हैं कि "/" वाक्यविन्यास ओएस-स्वतंत्र है। नोट Javadocs सुझाव है कि है कि ओएस पर निर्भर वाक्य रचना भी संभव है

अभी भी समस्या (आवश्यक?): @Nizet लिया और संपादित इस प्रकार है:

@Test 
public void testStackoverflowGlobber() throws IOException { 
    final PathMatcher matcher = 
FileSystems.getDefault().getPathMatcher("glob:*.cml"); 
     Files.walkFileTree(Paths.get("d:/petermr-workspace/jumbo-converters/jumbo-converters-cli/src/test/resources"), new SimpleFileVisitor<Path>() { 
      @Override 
      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
       System.out.println("try>> "+file); 
       if (matcher.matches(file)) { 
        System.out.println("MATCHES>>"+file); 
       } 
       return FileVisitResult.CONTINUE; 
      } 
     @Override 
     public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { 
      return FileVisitResult.CONTINUE; 
     } 
    }); 
} 

और इस तरह के रूप में उत्पादन देता है:

try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cdx 
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cdxml 
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.cml 
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.ref.cdxml 
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cdx\r19.ref.cml 
try>> d:\petermr-workspace\jumbo-converters\jumbo-converters-cli\src\test\resources\examples\cif\aa2004.cml 

लेकिन

+0

'/' किसी भी विंडोज सिस्टम पर ठीक काम करेगा अगर यह आपकी चिंता –

+0

@ ओलेग धन्यवाद है। इसलिए मुझे कुछ तर्क गलत है या माना जाता है कि विधियों की अलग-अलग कार्यक्षमता है। फाइल.सेपरेटर इसलिए गलत है? [मुझे आधिकारिक दस्तावेज बल्कि स्केची मिलते हैं] –

+0

क्या आपने "ग्लोब: **/*। सीएमएल" की कोशिश की है? –

उत्तर

12

यहाँ मिलान के कोई सबूत नहीं एक काम उदाहरण है जो किसी भी वंशज dir में सभी ज़िप फ़ाइलें प्रदर्शित करता है d:/ की ectory:

public static void main(String[] args) throws IOException { 
    final PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:d:/**/*.zip"); 
    Files.walkFileTree(Paths.get("d:/"), new SimpleFileVisitor<Path>() { 
     @Override 
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
      if (matcher.matches(file)) { 
       System.out.println(file); 
      } 
      return FileVisitResult.CONTINUE; 
     } 

     @Override 
     public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { 
      return FileVisitResult.CONTINUE; 
     } 
    }); 
} 

जैसा कि आप देख, आगे का उपयोग कर विंडोज पर काम करता है स्लैश।

+1

धन्यवाद का उपयोग करना होगा। क्या यह सापेक्ष फ़ाइल पथ की जांच करेगा? –

+0

ने इसे स्वीकार कर लिया है क्योंकि यह एकमात्र उत्तर है और उसने फ़ाइल विभाजक की समस्या का सामना किया है। लेकिन मैं इसे अपने पर्यावरण पर काम नहीं कर सकता। ग्लोबिंग सिंटैक्स अपेक्षाकृत हल्के ढंग से प्रलेखित होता है और स्पष्ट उदाहरण नहीं हैं। ओह ठीक है, शायद कल काम करेगा ... –

+1

यदि आप 'ग्लोब: */**/*। ज़िप' –

5

आप

matcher = FileSystems.getDefault().getPathMatcher("glob:**/foo/**/bar/*.dat"); 
अन्यथा

,

matcher.matches(file) 

प्रयास एक नियमित अभिव्यक्ति है कि रिश्तेदार पथ के साथ शुरू होता है के खिलाफ फाइल करने के लिए पूरा पथ मिलान करने के लिए बुला के साथ अपने ग्लोब शुरू करने की आवश्यकता ** (/ foo /), पूर्ण पथ के बजाय (डी:/petermr-workspace /.../ foo)।

** ग्लोब पर ** तैयार करने से यह पूर्ण पथ की शुरुआत को अनदेखा करने के लिए कहता है।

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