How do I get the file name from a String containing the Absolute file path?
Asked Answered
D

13

304

String variable contains a file name, C:\Hello\AnotherFolder\The File Name.PDF. How do I only get the file name The File Name.PDF as a String?

I planned to split the string, but that is not the optimal solution.

Decalcomania answered 25/1, 2013 at 16:39 Comment(1)
with reference to issuetracker.google.com/issues/37131215, it has been fixed.Caloric
W
349

just use File.getName()

File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());

using String methods:

  File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");  
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
Wharfage answered 25/1, 2013 at 16:40 Comment(2)
Be careful with pathnames with "/" instead of "\"Fredricfredrick
@golimar, this should remove both Windows and Unix path (without using File class): YourStringPath.replaceAll("^.*[\\/\\\\]", "")Bochum
S
331

Alternative using Path (Java 7+):

Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();

Note that splitting the string on \\ is platform dependent as the file separator might vary. Path#getName takes care of that issue for you.

Sergei answered 25/1, 2013 at 16:44 Comment(5)
Has anyone done a performance comparison on the various methods in this question?Miocene
@Miocene I don't think that Paths.get accesses the file system so wouldn't expect the performance to be materially different from a substring/indexOf.Sergei
How come it doesn't exist on Android? weird.Muenster
Yes, Path copes with the platform dependent problem of slash/backslash, but only if the file path is from the same machine (or platform). Consider this: you upload file from Internet Explorer and it has the path "C:\\Hello\\AnotherFolder\\The File Name.PDF" but your code is working on a Unix/Linux machine then p.getFileName() will return the whole path, not just The File Name.PDF.Harve
Calling toString() is so awkward.Longawa
A
91

Using FilenameUtils in Apache Commons IO :

String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
Alost answered 5/9, 2016 at 18:52 Comment(3)
I think this one may be the best, because sometimes you may have to process the file path from other platformSchnook
Btw anyone wants to get the filename minus extension can use FilenameUtils.getBaseName(filePath)Footpath
This is the best solution. It is platform independent.Sampling
T
36

Considering the String you're asking about is

C:\Hello\AnotherFolder\The File Name.PDF

we need to extract everything after the last separator, ie. \. That is what we are interested in.

You can do

String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);

This will retrieve the index of the last \ in your String and extract everything that comes after it into fileName.

If you have a String with a different separator, adjust the lastIndexOf to use that separator. (There's even an overload that accepts an entire String as a separator.)

I've omitted it in the example above, but if you're unsure where the String comes from or what it might contain, you'll want to validate that the lastIndexOf returns a non-negative value because the Javadoc states it'll return

-1 if there is no such occurrence

Tempura answered 25/1, 2013 at 16:41 Comment(1)
Actually -1 return value can be used. Assuming the path is not empty and relative path are possible, If '\\' is not found then index +1 is 0 which is the position of the file name in that case.Loiret
H
31

Since 1.7

    Path p = Paths.get("c:\\temp\\1.txt");
    String fileName = p.getFileName().toString();
    String directory = p.getParent().toString();
Hebdomadal answered 20/10, 2016 at 12:10 Comment(0)
H
11

you can use path = C:\Hello\AnotherFolder\TheFileName.PDF

String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
Heeley answered 24/7, 2014 at 10:30 Comment(5)
You should use \\ instead of \Oestrone
You should not use any of those as it is platform dependent. / on unix and \`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like File` or Paths.Rudderhead
Is File.separator also platform dependent? Or would this work... String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());Woofer
File.separator & File.separatorChar are both "/" on UNIX/Linux/macOS version of JDK, and both "\" on Windows version.Democrat
File.separator won't always work here because in Windows a filename can be separated by either "/" or "\\".Terrel
Z
11

The other answers didn't quite work for my specific scenario, where I am reading paths that have originated from an OS different to my current one. To elaborate I am saving email attachments saved from a Windows platform on a Linux server. The filename returned from the JavaMail API is something like 'C:\temp\hello.xls'

The solution I ended up with:

String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];
Zwick answered 5/11, 2015 at 4:54 Comment(0)
F
4

getFileName() method of java.nio.file.Path used to return the name of the file or directory pointed by this path object.

Path getFileName()

For reference:

https://www.geeksforgeeks.org/path-getfilename-method-in-java-with-examples/

Felizio answered 11/10, 2019 at 12:27 Comment(0)
D
3

Considere the case that Java is Multiplatform:

int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
    fileName = fileName.substring(lastPath+1);
}
Deli answered 15/5, 2018 at 19:4 Comment(0)
A
1

A method without any dependency and takes care of .. , . and duplicate separators.

public static String getFileName(String filePath) {
    if( filePath==null || filePath.length()==0 )
        return "";
    filePath = filePath.replaceAll("[/\\\\]+", "/");
    int len = filePath.length(),
        upCount = 0;
    while( len>0 ) {
        //remove trailing separator
        if( filePath.charAt(len-1)=='/' ) {
            len--;
            if( len==0 )
                return "";
        }
        int lastInd = filePath.lastIndexOf('/', len-1);
        String fileName = filePath.substring(lastInd+1, len);
        if( fileName.equals(".") ) {
            len--;
        }
        else if( fileName.equals("..") ) {
            len -= 2;
            upCount++;
        }
        else {
            if( upCount==0 )
                return fileName;
            upCount--;
            len -= fileName.length();
        }
    }
    return "";
}

Test case:

@Test
public void testGetFileName() {
    assertEquals("", getFileName("/"));
    assertEquals("", getFileName("////"));
    assertEquals("", getFileName("//C//.//../"));
    assertEquals("", getFileName("C//.//../"));
    assertEquals("C", getFileName("C"));
    assertEquals("C", getFileName("/C"));
    assertEquals("C", getFileName("/C/"));
    assertEquals("C", getFileName("//C//"));
    assertEquals("C", getFileName("/A/B/C/"));
    assertEquals("C", getFileName("/A/B/C"));
    assertEquals("C", getFileName("/C/./B/../"));
    assertEquals("C", getFileName("//C//./B//..///"));
    assertEquals("user", getFileName("/user/java/.."));
    assertEquals("C:", getFileName("C:"));
    assertEquals("C:", getFileName("/C:"));
    assertEquals("java", getFileName("C:\\Program Files (x86)\\java\\bin\\.."));
    assertEquals("C.ext", getFileName("/A/B/C.ext"));
    assertEquals("C.ext", getFileName("C.ext"));
}

Maybe getFileName is a bit confusing, because it returns directory names also. It returns the name of file or last directory in a path.

Arad answered 29/3, 2016 at 11:49 Comment(0)
C
0

extract file name using java regex *.

public String extractFileName(String fullPathFile){
        try {
            Pattern regex = Pattern.compile("([^\\\\/:*?\"<>|\r\n]+$)");
            Matcher regexMatcher = regex.matcher(fullPathFile);
            if (regexMatcher.find()){
                return regexMatcher.group(1);
            }
        } catch (PatternSyntaxException ex) {
            LOG.info("extractFileName::pattern problem <"+fullPathFile+">",ex);
        }
        return fullPathFile;
    }
Camphorate answered 21/6, 2017 at 12:17 Comment(0)
M
0

You can use FileInfo object to get all information of your file.

    FileInfo f = new FileInfo(@"C:\Hello\AnotherFolder\The File Name.PDF");
    MessageBox.Show(f.Name);
    MessageBox.Show(f.FullName);
    MessageBox.Show(f.Extension );
    MessageBox.Show(f.DirectoryName);
Mussulman answered 29/1, 2020 at 8:55 Comment(0)
L
-6

This answer works for me in c#:

using System.IO;
string fileName = Path.GetFileName("C:\Hello\AnotherFolder\The File Name.PDF");
Ladylike answered 23/10, 2020 at 17:0 Comment(1)
question is for java.Honesty

© 2022 - 2024 — McMap. All rights reserved.