programing

Absolute 파일 경로를 포함하는 문자열에서 파일 이름을 가져오려면 어떻게 해야 합니까?

goodcopy 2022. 8. 16. 23:11
반응형

Absolute 파일 경로를 포함하는 문자열에서 파일 이름을 가져오려면 어떻게 해야 합니까?

String변수에는 파일 이름이 포함되어 있습니다.C:\Hello\AnotherFolder\The File Name.PDF파일 이름만 가져오려면 어떻게 해야 하나요?The File Name.PDF스트링으로요?

나는 끈을 나누려고 계획했지만, 그것은 최적의 해결책이 아니다.

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

대체 사용(Java 7+):

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

에 스트링을 분할하는 것에 주의해 주세요.\\는 파일 구분자가 다를 수 있으므로 플랫폼에 의존합니다. Path#getName당신을 위해 그 문제를 해결합니다.

사용.FilenameUtilsApache Commons IO:

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

을 고려하다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구분자로 사용합니다.)

위의 예에서는 생략했습니다만, 어디에 있는지 불명확한 경우는,String그 출처나 그 내용물이 어떤 것인지 검증할 필요가 있습니다.lastIndexOfJavadoc이 반환한다고 밝혔기 때문에 음수가 아닌 값을 반환합니다.

-1이 없는 경우

1.7 이후

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

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

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

다른 답변은 현재 사용하고 있는 OS와 다른 OS에서 유래한 경로를 읽고 있는 특정 시나리오에서는 그다지 효과가 없었습니다.자세한 내용은 Windows 플랫폼에서 Linux 서버에 저장한 이메일 첨부 파일을 저장하고 있습니다.JavaMail API에서 반환되는 파일명은 'C:\temp\hello'와 같습니다.xls'

결론은 다음과 같습니다.

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

Java가 Multiplatform인 경우:

int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
    fileName = fileName.substring(lastPath+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은 디렉토리 이름도 반환하기 때문에 조금 혼란스러울 수 있습니다.경로 내의 파일 또는 마지막 디렉토리의 이름을 반환합니다.

java.nio.file의 getFileName() 메서드.이 경로 개체가 가리키는 파일 또는 디렉터리의 이름을 반환하는 데 사용되는 경로입니다.

경로 getFileName()

참조용:

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

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

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

이 답변은 c#에서 유효합니다.

using System.IO;
string fileName = Path.GetFileName("C:\Hello\AnotherFolder\The File Name.PDF");

언급URL : https://stackoverflow.com/questions/14526260/how-do-i-get-the-file-name-from-a-string-containing-the-absolute-file-path

반응형