วิธีรับชื่อไดเร็กทอรีหลักของไฟล์เฉพาะ


112

วิธีรับdddจากชื่อพา ธ ที่ test.java อยู่

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

1
นี่เป็นไฟล์ทั่วไปหรือคุณกำลังพยายามรับไดเร็กทอรีหลักของไฟล์ต้นฉบับของคุณ ถ้าเป็นอย่างหลังฉันไม่แน่ใจว่าคุณเข้าใจการคอมไพล์ Java ในขณะรันไทม์test.javaอาจไม่มีอยู่ในคอมพิวเตอร์ที่กำลังเรียกใช้โปรแกรม เป็น.classไฟล์คอมไพล์ที่รัน ดังนั้นสิ่งนี้จะใช้ได้ก็ต่อเมื่อคุณรู้ว่าอยู่ที่ไหนdddในกรณีนี้จะไม่มีจุดใดที่จะค้นหาได้โดยใช้โปรแกรม ยากแค่รหัสมัน
Mark Peters

คำตอบ:


143

ใช้File's getParentFile()วิธีการและString.lastIndexOf()เพื่อดึงเพียงไดเรกทอรีหลักทันที

ความคิดเห็นของ Mark เป็นทางออกที่ดีกว่าlastIndexOf():

file.getParentFile().getName();

โซลูชันเหล่านี้ใช้งานได้ก็ต่อเมื่อไฟล์นั้นมีไฟล์พาเรนต์ (เช่นสร้างผ่านตัวสร้างไฟล์ตัวใดตัวหนึ่งที่ใช้พาเรนต์File) เมื่อgetParentFile()ใดที่เป็นโมฆะคุณจะต้องหันไปใช้lastIndexOfหรือใช้บางอย่างเช่นApache Commons 'FileNameUtils.getFullPath() :

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

มีหลายตัวแปรในการเก็บ / วางคำนำหน้าและตัวคั่นต่อท้าย คุณสามารถใช้FilenameUtilsคลาสเดียวกันเพื่อคว้าชื่อจากผลลัพธ์ใช้lastIndexOfฯลฯ


14
คุณไม่จำเป็นต้องใช้เพียงlastIndexOf file.getParentFile().getName()
Mark Peters

13
ในกรณี ถ้ามันกลับnull(ถ้าคุณสร้างFileอินสแตนซ์มีเส้นทางญาติ) - file.getAbsoluteFile().getParentFile().getName()ลอง
nidu

1
@MarkPeters ใช้งานได้ก็ต่อเมื่อไฟล์ถูกสร้างขึ้นด้วยไฟล์หลักซึ่งฉันเดาว่าค่อนข้างน้อย
Dave Newton

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

f.getParentFile() สามารถเป็นค่าว่างได้ดังนั้นคุณควรตรวจสอบ


1
เพื่อให้แน่ใจว่าผลลัพธ์จะเป็นดังนี้ C: / aaa / bbb / ccc / ddd
Guy Avraham

16

ใช้ด้านล่าง

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

ควรชี้ให้เห็นว่าวิธีนี้ควรมีชุดหลักแม้ว่าไฟล์พื้นฐานจะไม่มีก็ตาม
ก้าว

14

ใน Java 7 คุณมีPaths apiใหม่ วิธีแก้ปัญหาที่ทันสมัยและสะอาดที่สุดคือ:

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

ผลลัพธ์จะเป็น:

C:/aaa/bbb/ccc/ddd

5

หากคุณมีแค่ String path และไม่ต้องการสร้าง File object ใหม่คุณสามารถใช้สิ่งต่อไปนี้:

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
สิ่งนี้จะพ่น ArrayOutOfBoundsException หากคุณอยู่ในตำแหน่งรูทแล้ว - "/" -
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"

หากคุณต้องการต่อท้ายโฟลเดอร์ "ddd" โดยใช้เส้นทางอื่น

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

1

จาก java 7 ฉันต้องการใช้ Path คุณจะต้องใส่เส้นทางลงใน:

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

และสร้างวิธีการรับ:

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

0

ใน Groovy:

ไม่จำเป็นต้องสร้างFileอินสแตนซ์เพื่อแยกวิเคราะห์สตริงให้ยุ่งยาก สามารถทำได้ดังนี้:

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

การแบ่งจะสร้างอาร์เรย์[C:, aaa, bbb, ccc, ddd, test.java]และดัชนี-2จะชี้ไปที่รายการก่อนรายการสุดท้ายซึ่งในกรณีนี้คือddd



0

สำหรับ Kotlin:

 fun getFolderName() {
            
            val uri: Uri
            val cursor: Cursor?
    
            uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
            val projection = arrayOf(MediaStore.Audio.AudioColumns.DATA)
            cursor = requireActivity().contentResolver.query(uri, projection, null, null, null)
            if (cursor != null) {
                column_index_data = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.DATA)
            }
            
            while (cursor!!.moveToNext()) {
    
                absolutePathOfImage = cursor.getString(column_index_data)
    
    
                val fileName: String = File(absolutePathOfImage).parentFile.name
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.