2009-10-14 14 views
37

कहें कि मेरे पास ऐसा कुछ है:क्या ग्रोवी के पास विस्तार के बिना फ़ाइल नाम प्राप्त करने का एक आसान तरीका है?

new File("test").eachFile() { file-> 
println file.getName() 
} 

यह test निर्देशिका में प्रत्येक फ़ाइल का पूरा फ़ाइल नाम प्रिंट करता है। क्या बिना किसी एक्सटेंशन के फ़ाइल नाम प्राप्त करने का कोई ग्रोवी तरीका है? (या मैं वापस regex भूमि में हूँ?)

+2

कभी कभी फ़ाइलें एक विस्तार नहीं है, लेकिन एक 'उन में .' की क्या ज़रूरत है। –

उत्तर

4

हो सकता है कि के रूप में आसान नहीं के रूप में आप की उम्मीद है, लेकिन काम कर रहे:

new File("test").eachFile { 
    println it.name.lastIndexOf('.') >= 0 ? 
    it.name[0 .. it.name.lastIndexOf('.')-1] : 
    it.name 
    } 
0

आप रेगुलर एक्सप्रेशन का बेहतर उपयोग कर सकते हैं। निम्नलिखित की तरह एक समारोह चाल करना होगा:

def getExtensionFromFilename(filename) { 
    def returned_value = "" 
    m = (filename =~ /(\.[^\.]*)$/) 
    if (m.size()>0) returned_value = ((m[0][0].size()>0) ? m[0][0].substring(1).trim().toLowerCase() : ""); 
    return returned_value 
} 
43

मेरा मानना ​​है कि grooviest तरीका होगा:

file.name.lastIndexOf('.').with {it != -1 ? file.name[0..<it] : file.name} 

या एक सरल regexp साथ:

file.name.replaceFirst(~/\.[^\.]+$/, '') 

भी एक अपाचे वहाँ उस तरह के उद्देश्यों के लिए कॉमन्स-आईओ जावा lib, जो आप आसानी से निर्भर कर सकते हैं यदि आप मेवेन का उपयोग करते हैं:

org.apache.commons.io.FilenameUtils.getBaseName(file.name) 
7
new File("test").eachFile() { file-> 
    println file.getName().split("\\.")[0] 
} 

इस तरह फ़ाइल नाम के लिए अच्छी तरह से काम करता है: foo, foo.bar

लेकिन अगर आप एक फ़ाइल foo.bar.jar है, तो इसके बाद के संस्करण कोड बाहर प्रिंट: foo आप यह चाहते हैं इसके बजाए foo.bar को प्रिंट करने के लिए, फिर निम्न कोड प्राप्त करता है।

new File("test").eachFile() { file-> 
    def names = (file.name.split("\\.") 
    def name = names.size() > 1 ? (names - names[-1]).join('.') : names[0] 
    println name 
} 
1

, टिप्पणी में उल्लेख किया है जहां एक फ़ाइल नाम समाप्त हो जाती है & एक विस्तार शुरू होता है स्थिति पर निर्भर करता है। (बिना पथ फ़ाइल, और विस्तार के बिना) मेरी स्थिति में, मैं basename प्राप्त करने के लिए आवश्यक निम्न प्रकार की फ़ाइलें की: {foo.zip, bar/foo.tgz, foo.tar.gz} => सभी "foo" का निर्माण करने के लिए फ़ाइल नाम बिना के रूप में की जरूरत है विस्तार। (foo.tar.gz दिए गए अधिकांश समाधान foo.tar का उत्पादन करेंगे।)

यहां एक (स्पष्ट) समाधान है जो आपको पहले सब कुछ देगा "।"; वैकल्पिक रूप से, आप पूरे एक्सटेंशन को या तो टुकड़ों में या (इस मामले में) को एक ही शेष के रूप में प्राप्त कर सकते हैं (फ़ाइल नाम को 2 भागों में विभाजित कर सकते हैं)। (नोट: हालांकि हाथ में काम से संबंधित नहीं है, मैं भी मार्ग के रूप में अच्छी तरह से दूर करने रहा हूँ, file.name फोन करके।)

file=new File("temp/foo.tar.gz") 
file.name.split("\\.", 2)[0] // => return "foo" at [0], and "tar.gz" at [1] 
+0

मुझे नहीं पता कि मुझे इसे पोस्ट करने के बाद तक मौरो का जवाब क्यों नहीं मिला। यह एक टिप्पणी होनी चाहिए, क्योंकि यह लगभग समान है, लेकिन केवल बिना/बंद के। मैं इसे अभी छोड़ दूंगा, क्योंकि अगर {{file -> yada yada} 'वाक्यविन्यास (जो कि मूल प्रश्न में निश्चित रूप से था, लेकिन अन्यथा समस्या से अप्रासंगिक है) से अपरिचित है, तो इसे पढ़ने में आसान है। – michael

1

FilenameUtils वर्ग है, जो पैकेज कब Apache Commons का हिस्सा है, एक मजबूत है उपाय। उदाहरण उपयोग:

import org.apache.commons.io.FilenameUtils 

String filename = '/tmp/hello-world.txt' 
def fileWithoutExt = FilenameUtils.removeExtension(filename) 

यह ग्रोवी तरीका नहीं है, लेकिन यदि आपको बहुत से किनारे के मामलों का समर्थन करने की आवश्यकता है तो सहायक हो सकता है।

0

नोट

import java.io.File; 

def fileNames = [ "https://stackoverflow.com/a/b.c/first.txt", 
        "/b/c/second", 
        "c:\\a\\b.c\\third...", 
        "c:\\a\b\\c\\.text" 
        ] 

def fileSeparator = ""; 

fileNames.each { 
    // You can keep the below code outside of this loop. Since my example 
    // contains both windows and unix file structure, I am doing this inside the loop. 
    fileSeparator= "\\" + File.separator; 
    if (!it.contains(File.separator)) { 
     fileSeparator = "\\/" 
    } 

    println "File extension is : ${it.find(/((?<=\.)[^\.${fileSeparator}]+)$/)}" 
    it = it.replaceAll(/(\.([^\.${fileSeparator}]+)?)$/,"") 

    println "Filename is ${it}" 
} 

के लिए निम्न उपाय इस उदाहरण के लिए काम नहीं करता है (अपाचे लाइब्रेरी का उपयोग कर एक को छोड़कर) में से कुछ - c: /test.me/firstfile

अगर मैं कोशिश उपर्युक्त प्रविष्टि के लिए एक एक्सटेंशन खोजने के लिए, मुझे ".me/firstfile" मिलेगा: --(

उपस्थित होने पर फ़ाइल.सेपरेटर की आखिरी घटना को ढूंढने के लिए बेहतर तरीका होगा और फिर फ़ाइल नाम या एक्सटेंशन देखें।

नोट: (नीचे एक छोटी सी चाल होती है। विंडोज के लिए, फ़ाइल विभाजक \ है। लेकिन यह नियमित अभिव्यक्ति में एक विशेष चरित्र है और इसलिए जब हम नियमित अभिव्यक्ति में File.separator युक्त चर का उपयोग करते हैं, तो मुझे इसे बचाना होगा।

def fileSeparator= "\\" + File.separator; 

आशा है कि यह बनाता है भावना :)

इस आजमाएं::

import java.io.File; 

String strFilename  = "C:\\first.1\\second.txt"; 
// Few other flavors 
// strFilename = "/dd/dddd/2.dd/dio/dkljlds.dd" 

def fileSeparator= "\\" + File.separator; 
if (!strFilename.contains(File.separator)) { 
    fileSeparator = "\\/" 
} 

def fileExtension = ""; 
(strFilename =~ /((?<=\.)[^\.${fileSeparator}]+)$/).each { match, extension -> fileExtension = extension } 
println "Extension is:$fileExtension" 
14

स्पष्ट तरीका यही कारण है कि मैं यह कर रहा है।

String fileWithoutExt = file.name.take(file.name.lastIndexOf('.'))

0

सबसे आसान तरीका है:

'file.name.with.dots.tgz' - ~/\.\w+$/​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

परिणाम है:

file.name.with.dots 
-1
// Create an instance of a file (note the path is several levels deep) 
File file = new File('/tmp/whatever/certificate.crt') 

// To get the single fileName without the path (but with EXTENSION! so not answering the question of the author. Sorry for that...) 
String fileName = file.parentFile.toURI().relativize(file.toURI()).getPath() 
+0

मुझे यह नहीं मिला ... –

+0

न तो मैं करता हूं :) मैंने जाहिर तौर पर पथ के बिना फ़ाइल नाम कैसे प्राप्त किया है, लेकिन विस्तार के साथ एक उदाहरण प्रदान किया है। तो मैंने लेखक के सवाल का जवाब नहीं दिया। – Marco

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

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