Wie erhalte ich den Dateinamen von einem String, der den absoluten Dateipfad enthält?


Antworten:


279

benutze einfach File.getName ()

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

Verwenden von String-Methoden :

  File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");  
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));

Hilfreich. Vielen Dank.
Pooja

Seien Sie vorsichtig mit Pfadnamen mit "/" anstelle von "\"
Golimar

278

Alternative Verwendung Path(Java 7+):

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

Beachten Sie, dass das Aufteilen der Zeichenfolge \\plattformabhängig ist, da das Dateitrennzeichen variieren kann. Path#getNamekümmert sich um dieses Problem für Sie.


1
Hat jemand einen Leistungsvergleich der verschiedenen Methoden in dieser Frage durchgeführt?
Crush

@crush Ich glaube nicht, dass Paths.getauf das Dateisystem zugegriffen wird, daher würde ich nicht erwarten, dass sich die Leistung wesentlich von einer Teilzeichenfolge / einem Index unterscheidet.
Assylias

7
Wie kommt es, dass es auf Android nicht existiert? seltsam.
Android-Entwickler

12
Ja, Path bewältigt das plattformabhängige Problem von Schrägstrich / Backslash, jedoch nur, wenn der Dateipfad von demselben Computer (oder derselben Plattform) stammt. Bedenken Sie Folgendes: Sie laden eine Datei von hoch Internet Explorerund sie hat den Pfad, "C:\\Hello\\AnotherFolder\\The File Name.PDF"aber Ihr Code funktioniert auf einem Unix / Linux-Computer. Dann p.getFileName()wird der gesamte Pfad zurückgegeben, nicht nur The File Name.PDF.
Nyxz

3
Anrufen toString()ist so umständlich.
PetroCliff

53

Verwenden FilenameUtilsin Apache Commons IO :

String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");

5
Ich denke, dies ist vielleicht das Beste, weil Sie manchmal den Dateipfad von einer anderen Plattform verarbeiten müssen
ruiruige1991

Dies ist das Beste, weil: Einfach zu lesen, am robustesten, weniger Objektklumpen im Code +1
fl0w

32

In Anbetracht dessen String, wonach Sie fragen, ist

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

wir müssen alles nach dem letzten Trennzeichen extrahieren, dh. \. Das interessiert uns.

Du kannst tun

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

Dadurch wird der Index des letzten \in Ihrem abgerufen Stringund alles extrahiert, was danach kommt fileName.

Wenn Sie ein StringTrennzeichen mit einem anderen haben, passen Sie das lastIndexOfan, um dieses Trennzeichen zu verwenden. (Es gibt sogar eine Überlastung , die ein Ganzes Stringals Trennzeichen akzeptiert .)

Ich habe es im obigen Beispiel weggelassen, aber wenn Sie sich nicht sicher sind, woher das Stringkommt oder was es enthalten könnte, sollten Sie überprüfen, ob das lastIndexOfeinen nicht negativen Wert zurückgibt, da das Javadoc angibt, dass es zurückkehren wird

-1 wenn es kein solches Vorkommen gibt


25

Seit 1.7

    Path p = Paths.get("c:\\temp\\1.txt");
    String fileName = p.getFileName().toString();
    String directory = p.getParent().toString();

11

Sie können path = C: \ Hello \ AnotherFolder \ TheFileName.PDF verwenden

String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());

Sie sollten \\ anstelle von \
Anoop Chandrika HarisudhanNair

2
Sie sollten keines davon verwenden, da es plattformabhängig ist. /unter Unix und \`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like File` oder Paths.
Automatico

3
Ist File.separatorauch plattformabhängig? Oder würde das funktionieren ... String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
Jonathan

File.separator & File.separatorChar sind beide "/" unter UNIX / Linux / macOS-Version von JDK und beide "\" unter Windows-Version.
賈 可 Jacky

2
File.separatorfunktioniert hier nicht immer, da in Windows ein Dateiname entweder durch "/"oder getrennt werden kann "\\".
DodgyCodeException

10

Die anderen Antworten haben in meinem speziellen Szenario, in dem ich Pfade lese, die von einem anderen Betriebssystem als meinem aktuellen stammen, nicht ganz funktioniert. Zur Erläuterung speichere ich E-Mail-Anhänge, die von einer Windows-Plattform auf einem Linux-Server gespeichert wurden. Der von der JavaMail-API zurückgegebene Dateiname lautet etwa "C: \ temp \ hello.xls".

Die Lösung, mit der ich endete:

String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];

3

Betrachten Sie den Fall, dass Java Multiplattform ist:

int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
    fileName = fileName.substring(lastPath+1);
}

1

Eine Methode ohne Abhängigkeit und kümmert sich um .. , . und doppelte Trennzeichen.

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 "";
}

Testfall:

@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"));
}

Vielleicht ist getFileName etwas verwirrend, weil es auch Verzeichnisnamen zurückgibt. Es gibt den Namen der Datei oder des letzten Verzeichnisses in einem Pfad zurück.


0

Extrahieren Sie den Dateinamen mit 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;
    }


0

Sie können das FileInfo-Objekt verwenden, um alle Informationen Ihrer Datei abzurufen.

    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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.