Cách chỉ lấy tên thư mục mẹ của một tệp cụ thể


111

Cách lấy dddtừ tên đường dẫn nơi chứa test.java.

File file = new File("C:/aaa/bbb/ccc/ddd/test.java");

1
Đây là tệp chung hay bạn đang cố lấy thư mục mẹ của tệp nguồn? Nếu sau này, tôi không chắc bạn hiểu về biên dịch Java. Trong thời gian chạy, test.javacó thể sẽ không tồn tại trên máy tính nơi chương trình đang được chạy. Đó là .classtệp đã biên dịch được chạy. Vì vậy, điều này sẽ chỉ hoạt động nếu bạn biết dddvị trí của nó, trong trường hợp đó, không có ích gì khi tìm nó theo chương trình; chỉ cần mã cứng nó.
Mark Peters

Câu trả lời:


141

Sử dụng File's getParentFile()phương phápString.lastIndexOf()để lấy chỉ thư mục cha ngay lập tức.

Nhận xét của Mark là một giải pháp tốt hơn lastIndexOf():

file.getParentFile().getName();

Các giải pháp này chỉ hoạt động nếu tệp có tệp mẹ (ví dụ: được tạo thông qua một trong các trình tạo tệp lấy tệp mẹ File). Khi nào getParentFile()là null, bạn sẽ cần phải sử dụng lastIndexOfhoặc sử dụng một cái gì đó như Apache Commons 'FileNameUtils.getFullPath() :

FilenameUtils.getFullPathNoEndSeparator(file.getAbsolutePath());
=> C:/aaa/bbb/ccc/ddd

Có một số biến thể để giữ lại / bỏ dấu phân cách tiền tố và dấu. Bạn có thể sử dụng cùng một FilenameUtilslớp để lấy tên từ kết quả, sử dụng lastIndexOf, v.v.


14
Bạn không cần lastIndexOf, chỉ cần sử dụng file.getParentFile().getName().
Mark Peters

13
Đề phòng thôi. Nếu nó trả về null(nếu bạn đã tạo Filecá thể với đường dẫn tương đối) - hãy thử file.getAbsoluteFile().getParentFile().getName().
nidu 24/12/12

1
@MarkPeters Tuy nhiên, điều đó chỉ hoạt động khi tệp được tạo bằng Tệp mẹ, điều mà tôi đoán là tương đối hiếm.
Dave Newton

20
File f = new File("C:/aaa/bbb/ccc/ddd/test.java");
System.out.println(f.getParentFile().getName())

f.getParentFile() có thể là null, vì vậy bạn nên kiểm tra nó.


1
Chỉ cần chắc chắn rằng, sản lượng như sau: C: / aaa / bbb / ccc / ddd
Guy Avraham

16

Sử dụng bên dưới,

File file = new File("file/path");
String parentPath = file.getAbsoluteFile().getParent();

Đáng chỉ ra rằng phương thức này phải có tập hợp cha, ngay cả khi tệp cơ bản không có.
Nhịp độ

13

Trong Java 7, bạn có api Đường dẫn mới . Giải pháp hiện đại và sạch nhất là:

Paths.get("C:/aaa/bbb/ccc/ddd/test.java").getParent().getFileName();

Kết quả sẽ là:

C:/aaa/bbb/ccc/ddd

5

Nếu bạn chỉ có đường dẫn Chuỗi và không muốn tạo đối tượng Tệp mới, bạn có thể sử dụng một cái gì đó như:

public static String getParentDirPath(String fileOrDirPath) {
    boolean endsWithSlash = fileOrDirPath.endsWith(File.separator);
    return fileOrDirPath.substring(0, fileOrDirPath.lastIndexOf(File.separatorChar, 
            endsWithSlash ? fileOrDirPath.length() - 2 : fileOrDirPath.length() - 1));
}

4
Đây ném ArrayOutOfBoundsException nếu bạn đã vào vị trí gốc - "/" -
Jnmgr

2
File file = new File("C:/aaa/bbb/ccc/ddd/test.java");
File curentPath = new File(file.getParent());
//get current path "C:/aaa/bbb/ccc/ddd/"
String currentFolder= currentPath.getName().toString();
//get name of file to string "ddd"

nếu bạn cần thêm thư mục "ddd" bằng cách sử dụng đường dẫn khác;

String currentFolder= "/" + currentPath.getName().toString();

1

Từ java 7, tôi thích sử dụng Path hơn. Bạn chỉ cần đặt đường dẫn vào:

Path dddDirectoryPath = Paths.get("C:/aaa/bbb/ccc/ddd/test.java");

và tạo một số phương thức get:

public String getLastDirectoryName(Path directoryPath) {
   int nameCount = directoryPath.getNameCount();
   return directoryPath.getName(nameCount - 1);
}

0

Ở Groovy:

Không cần tạo một Filethể hiện để phân tích cú pháp chuỗi trong groovy. Nó có thể được thực hiện như sau:

String path = "C:/aaa/bbb/ccc/ddd/test.java"
path.split('/')[-2]  // this will return ddd

Việc phân tách sẽ tạo ra mảng [C:, aaa, bbb, ccc, ddd, test.java]và chỉ mục -2sẽ trỏ đến mục nhập trước mục cuối cùng, trong trường hợp này làddd


0
    //get the parentfolder name
    File file = new File( System.getProperty("user.dir") + "/.");
    String parentPath = file.getParentFile().getName();
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.