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

235

StringVariable enthält einen Dateinamen , C:\Hello\AnotherFolder\The File Name.PDF. Wie erhalte ich nur den Dateinamen The File Name.PDFals String?

Ich hatte vor, den String zu teilen, aber das ist nicht die optimale Lösung.

Sharon Hwk
quelle
Mit Bezug auf issuetracker.google.com/issues/37131215 wurde dies behoben.
Prags

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));
PermGenError
quelle
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.

Assylien
quelle
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");
Binoy Babu
quelle
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

Sotirios Delimanolis
quelle
25

Seit 1.7

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

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

String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
Rakesh
quelle
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];
javaPhobic
quelle
3

Betrachten Sie den Fall, dass Java Multiplattform ist:

int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
    fileName = fileName.substring(lastPath+1);
}
Alejandro Hdz
quelle
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.

Yavuzkavus
quelle
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;
    }
HJK
quelle
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);
Blauer Phönix
quelle