Does groovy have an easy way to get a filename without the extension?

前端 未结 10 1028
-上瘾入骨i
-上瘾入骨i 2020-12-14 14:41

Say I have something like this:

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

This prints the full filename of eve

相关标签:
10条回答
  • 2020-12-14 15:10

    Note

    import java.io.File;
    
    def fileNames    = [ "/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}" 
    }
    

    Some of the below solutions (except the one using apache library) doesn't work for this example - c:/test.me/firstfile

    If I try to find an extension for above entry, I will get ".me/firstfile" - :(

    Better approach will be to find the last occurrence of File.separator if present and then look for filename or extension.

    Note: (There is a little trick happens below. For Windows, the file separator is \. But this is a special character in regular expression and so when we use a variable containing the File.separator in the regular expression, I have to escape it. That is why I do this:

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

    Hope it makes sense :)

    Try this out:

    import java.io.File;
    
    String strFilename     =  "C:\\first.1\\second.txt";
    // Few other flavors 
    // strFilename = "/dd/ffffdd/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"
    
    0 讨论(0)
  • 2020-12-14 15:11

    I believe the grooviest way would be:

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

    or with a simple regexp:

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

    also there's an apache commons-io java lib for that kinda purposes, which you could easily depend on if you use maven:

    org.apache.commons.io.FilenameUtils.getBaseName(file.name)
    
    0 讨论(0)
  • 2020-12-14 15:12

    The FilenameUtils class, which is part of the apache commons io package, has a robust solution. Example usage:

    import org.apache.commons.io.FilenameUtils
    
    String filename = '/tmp/hello-world.txt'
    def fileWithoutExt = FilenameUtils.removeExtension(filename)
    

    This isn't the groovy way, but might be helpful if you need to support lots of edge cases.

    0 讨论(0)
  • 2020-12-14 15:19
    new File("test").eachFile() { file->  
        println file.getName().split("\\.")[0]
    }
    

    This works well for file names like: foo, foo.bar

    But if you have a file foo.bar.jar, then the above code prints out: foo If you want it to print out foo.bar instead, then the following code achieves that.

    new File("test").eachFile() { file->  
        def names = (file.name.split("\\.")
        def name = names.size() > 1 ? (names - names[-1]).join('.') : names[0]
        println name
    }
    
    0 讨论(0)
  • 2020-12-14 15:19

    You can use regular expressions better. A function like the following would do the trick:

    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
    }
    
    0 讨论(0)
  • 2020-12-14 15:20

    The cleanest way.

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

    0 讨论(0)
提交回复
热议问题