Як отримати ім'я файлу з рядка, що містить шлях до файлу Absolute?


236

Stringзмінна містить ім'я файлу, C:\Hello\AnotherFolder\The File Name.PDF. Як я можу отримати лише ім'я файлу The File Name.PDFу вигляді рядка?

Я планував розділити рядок, але це не оптимальне рішення.


з посиланням на issueetracker.google.com/isissue/37131215 , це було виправлено.
Праги

Відповіді:


280

просто використовуйте File.getName ()

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

за допомогою String методів :

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

Корисні. Дякую.
Пуджа

Будьте обережні з
іменами

278

Альтернативне використання Path(Java 7+):

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

Зауважте, що розділення рядка на \\платформі залежить, оскільки роздільник файлів може відрізнятися. Path#getNameопікується цим питанням для вас.


1
Хтось робив порівняння ефективності щодо різних методів у цьому питанні?
розчавити

@crush Я не думаю, що Paths.getзвертається до файлової системи, тому не очікував, що продуктивність буде суттєво відрізнятися від підрядкової / indexOf.
assylias

7
Чому він не існує на Android? дивно.
андроїд розробник

12
Так, Path впорається із залежною від платформи проблемою косої / зворотної косої риси, але лише в тому випадку, якщо шлях до файлу знаходиться з тієї ж машини (або платформи). Враховуйте це: ви завантажуєте файл з Internet Explorerнього, і він має шлях, "C:\\Hello\\AnotherFolder\\The File Name.PDF"але ваш код працює на машині Unix / Linux, тоді p.getFileName()він поверне весь шлях, а не тільки The File Name.PDF.
nyxz

3
Телефонувати toString()так незручно.
PetroCliff

53

Використання FilenameUtilsв AOche Commons IO :

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

5
Я думаю, що це може бути найкращим, тому що іноді вам доведеться обробити шлях до файлів з іншої платформи
ruiruige1991

Це найкраще, тому що: Легко читати, найміцніший, менш об’єктний кладдер у коді +1
fl0w

32

Зважаючи на Stringте, що ви просите про це

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

нам потрібно витягти все після останнього роздільника, тобто. \. Саме це нас цікавить.

Ви можете зробити

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

Це дозволить отримати індекс останнього \у вашому Stringта витягти все, що потрапляє після нього fileName.

Якщо у вас Stringінший роздільник, відрегулюйте його, lastIndexOfщоб використовувати цей роздільник. (Існує навіть перевантаження, яка приймає ціле Stringяк роздільник.)

Я пропустив це у наведеному вище прикладі, але якщо ви не впевнені, звідки Stringпоходить або що він може містити, ви хочете перевірити, що lastIndexOfповертає негативне значення, оскільки Javadoc заявляє, що повернеться

-1 якщо такого не відбувається


25

З 1.7

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

11

ви можете використовувати path = C: \ Hello \ AnotherFolder \ TheFileName.PDF

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

Ви повинні використовувати \\ замість \
Anoop Chandrika HarisudhanNair

2
Не слід використовувати жодне з них, оскільки це залежить від платформи. /на unix і \`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like File` або Paths.
Automatico

3
Чи File.separatorзалежить також платформа? Або це спрацювало б ... String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
Джонатан

File.separator & File.separatorChar обидва "/" у версії JDK для UNIX / Linux / macOS, і обидва "\" у версії Windows.
賈 可 Джекі

2
File.separatorне завжди працюватиме тут, оскільки в Windows ім'я файлу можна розділити "/"або "\\".
DodgyCodeException

10

Інші відповіді не спрацювали для мого конкретного сценарію, де я читаю шляхи, що виникли від ОС, відмінної від моєї поточної. Для розробки я зберігаю вкладення електронної пошти, збережені з платформи Windows на сервері Linux. Ім'я файлу, повернене з API JavaMail, виглядає як "C: \ temp \ hello.xls"

Рішення, в якому я закінчився:

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

3

Розглянемо випадок, що Java є мультиплатформою:

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

1

Метод без будь-якої залежності і піклується про .. , . і дублюючі роздільники.

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

Можливо, getFileName трохи заплутаний, тому що він також повертає імена каталогів. Він повертає ім'я файлу або останнього каталогу в шляху.


0

витягнути ім'я файлу за допомогою 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

Ви можете використовувати об'єкт FileInfo, щоб отримати всю інформацію про свій файл.

    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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.