절대 파일 경로를 포함하는 문자열에서 파일 이름을 어떻게 얻습니까?


답변:


280

단지 사용 ) (File.getName를

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

사용하여 문자열 방법 :

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

도움이됩니다. 감사.
Pooja

"\"대신 "/"를 사용하는 경로 이름에주의하십시오.
golimar

278

Path(자바 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
예. 경로는 파일 경로가 동일한 시스템 (또는 플랫폼)에서 온 경우에만 슬래시 / 백 슬래시의 플랫폼 종속 문제에 대처합니다. 이것을 고려하십시오 : 파일을 업로드 Internet Explorer하고 경로가 "C:\\Hello\\AnotherFolder\\The File Name.PDF"있지만 코드가 Unix / Linux 시스템에서 작동하는 경우 p.getFileName()뿐만 아니라 전체 경로를 반환합니다 The File Name.PDF.
nyxz

3
전화 toString()가 너무 어색합니다.
PetroCliff

53

Apache Commons IOFilenameUtils 에서 사용 :

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.)

위의 예제에서 생략했지만 Java 출처가 어디에서 왔는지 String또는 포함 할 수 있는지 확실하지 않은 경우 Javadoc 이 반환 할 것이라고 말했기lastIndexOf 때문에 음수가 아닌 값을 반환 하는지 확인하고 싶을 것입니다

그러한 발생이 없으면 -1


25

1.7 이후

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

11

경로 = C : \ Hello \ AnotherFolder \ TheFileName.PDF를 사용할 수 있습니다.

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

대신 \의 \\ 사용해야합니다
Anoop 찬드 HarisudhanNair

2
플랫폼에 따라 다르므로 사용하지 마십시오. /유닉스와 \`(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());
Jonathan

File.separator 및 File.separatorChar는 UNIX / Linux / macOS 버전의 JDK에서 "/"이고 Windows 버전에서 "\"입니다.
賈 可 Jacky

2
File.separatorWindows에서는 파일 이름을 "/"또는 로 분리 할 수 ​​있기 때문에 항상 여기서 작동하지는 않습니다 "\\".
DodgyCodeException

10

다른 답변은 현재 시나리오와 다른 OS에서 시작된 경로를 읽는 특정 시나리오에서 제대로 작동하지 않았습니다. 좀 더 정교하게 말하자면 Linux 서버의 Windows 플랫폼에서 저장된 전자 메일 첨부 파일을 저장합니다. JavaMail API에서 반환 된 파일 이름은 '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 정규식 *를 사용하여 파일 이름을 추출하십시오.

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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.