Làm cách nào để có được tên tệp từ Chuỗi chứa đường dẫn tệp Tuyệt đối?


235

Stringbiến chứa tên tệp , C:\Hello\AnotherFolder\The File Name.PDF. Làm cách nào để tôi chỉ lấy tên tệp The File Name.PDFdưới dạng Chuỗi?

Tôi dự định tách chuỗi, nhưng đó không phải là giải pháp tối ưu.


với tham chiếu đến suetracker.google.com/issues/37131215 , nó đã được sửa.
Prags

Câu trả lời:


279

chỉ cần sử dụng File.getName ()

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

sử dụng các phương thức String :

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

Hữu ích. Cảm ơn.
Pooja

Hãy cẩn thận với tên đường dẫn có "/" thay vì "\"
golimar

278

Sử dụng thay thế Path(Java 7+):

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

Lưu ý rằng việc tách chuỗi trên \\phụ thuộc vào nền tảng vì trình phân tách tệp có thể khác nhau. Path#getNamechăm sóc vấn đề đó cho bạn


1
Có ai đã thực hiện một so sánh hiệu suất về các phương pháp khác nhau trong câu hỏi này?
nghiền nát

@crush Tôi không nghĩ rằng việc Paths.gettruy cập hệ thống tệp nên sẽ không mong đợi hiệu suất sẽ khác về mặt vật chất so với chuỗi con / indexOf.
assylias

7
Tại sao nó không tồn tại trên Android? kỳ dị.
nhà phát triển Android

12
Có, Đường dẫn đối phó với vấn đề phụ thuộc nền tảng của dấu gạch chéo / dấu gạch chéo ngược, nhưng chỉ khi đường dẫn tệp đến từ cùng một máy (hoặc nền tảng). Hãy xem xét điều này: bạn tải lên tệp từ Internet Explorervà nó có đường dẫn "C:\\Hello\\AnotherFolder\\The File Name.PDF"nhưng mã của bạn đang hoạt động trên máy Unix / Linux, sau đó p.getFileName()sẽ trả về toàn bộ đường dẫn, không chỉ The File Name.PDF.
nyxz

3
Gọi toString()thì thật khó xử.
PetroCliff

53

Sử dụng FilenameUtilstrong Apache Commons IO :

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

5
Tôi nghĩ rằng cái này có thể là tốt nhất, bởi vì đôi khi bạn có thể phải xử lý đường dẫn tệp từ nền tảng khác
ruiruige1991

Đây là điều tốt nhất bởi vì: Dễ đọc, mạnh mẽ nhất, ít đối tượng hơn trong mã +1
fl0w

32

Xem xét Stringbạn đang hỏi về

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

chúng ta cần trích xuất mọi thứ sau dấu phân cách cuối cùng, nghĩa là. \. Đó là những gì chúng tôi quan tâm.

Bạn có thể làm

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

Điều này sẽ lấy chỉ mục cuối cùng \trong của bạn Stringvà trích xuất mọi thứ xuất hiện sau nó fileName.

Nếu bạn có một Stringdấu phân cách khác, hãy điều chỉnh lastIndexOfđể sử dụng dấu phân cách đó. (Thậm chí có một tình trạng quá tải chấp nhận toàn bộ Stringnhư một dải phân cách.)

Tôi đã bỏ qua nó trong ví dụ trên, nhưng nếu bạn không chắc nó Stringđến từ đâu hoặc nó có thể chứa gì, bạn sẽ muốn xác thực rằng lastIndexOfgiá trị đó không trả về giá trị vì Javadoc nói rằng nó sẽ trả về

-1 nếu không có sự cố như vậy


25

Từ 1.7

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

11

bạn có thể sử dụng path = C: \ Hello \ AnotherFolder \ TheFileName.PDF

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

Bạn nên sử dụng \\ thay vì \
Anoop Chandrika HarisudhanNair

2
Bạn không nên sử dụng bất kỳ trong số đó vì nó phụ thuộc vào nền tảng. /trên unix và \`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like File` hoặc Paths.
Automatico

3
File.separatornền tảng cũng phụ thuộc? Hoặc điều này sẽ làm việc ... String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
Jonathan

File.separator & File.separatorChar đều là "/" trên phiên bản UNIX / Linux / macOS của JDK và cả "\" trên phiên bản Windows.
賈 Jacky

2
File.separatorsẽ không luôn hoạt động ở đây vì trong Windows, tên tệp có thể được phân tách bằng "/"hoặc "\\".
DodgyCodeException 23/11/18

10

Các câu trả lời khác không hoàn toàn phù hợp với kịch bản cụ thể của tôi, nơi tôi đang đọc các đường dẫn có nguồn gốc từ một hệ điều hành khác với hệ điều hành hiện tại của tôi. Để giải thích, tôi đang lưu các tệp đính kèm email được lưu từ nền tảng Windows trên máy chủ Linux. Tên tệp được trả về từ API JavaMail giống như 'C: \ temp \ hello.xls'

Giải pháp tôi đã kết thúc với:

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

3

Xem xét trường hợp Java là Đa nền tảng:

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

1

Một phương pháp không có bất kỳ sự phụ thuộc và chăm sóc .. , . và phân tách trùng lặp.

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

Trường hợp thử nghiệm:

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

Có lẽ getFileName hơi khó hiểu, vì nó cũng trả về tên thư mục. Nó trả về tên của tệp hoặc thư mục cuối cùng trong một đường dẫn.


0

trích xuất tên tệp bằng 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

Bạn có thể sử dụng đối tượng FileInfo để lấy tất cả thông tin của tệp.

    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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.