วิธีสร้างไดเรกทอรีใน Java


386

ฉันจะสร้างไดเรกทอรี / โฟลเดอร์ได้อย่างไร

เมื่อฉันได้ทดสอบ System.getProperty("user.home");

ฉันต้องสร้างไดเรกทอรี (ชื่อไดเรกทอรี "โฟลเดอร์ใหม่") ถ้าหากไม่มีโฟลเดอร์ใหม่


24
โปรดตรวจสอบคำตอบที่ถูกต้องที่คุณเลือก ทางออกที่เสนอโดย JigarJoshi ทำให้เข้าใจผิด ไม่สามารถแก้ไขปัญหาได้อย่างถูกต้อง (ดูความคิดเห็นของฉัน) โซลูชัน (ง่าย) ที่เสนอโดย Bozho นั้นดีกว่ามาก
— mwhs

mkdirเป็น idempotent ใน java การใช้งานจะทำการตรวจสอบว่ามีไดเรกทอรีสำหรับคุณหรือไม่และจะสร้างเฉพาะในกรณีที่ไม่มีอยู่
— mwhs

คำตอบ:


460

หลังจาก ~ 7 ปีฉันจะอัปเดตเป็นวิธีที่ดีกว่าซึ่ง Bozho แนะนำ

new File("/path/directory").mkdirs();

เลิกใช้:

File theDir = new File("new folder");

// if the directory does not exist, create it
if (!theDir.exists()) {
    System.out.println("creating directory: " + theDir.getName());
    boolean result = false;

    try{
        theDir.mkdir();
        result = true;
    } 
    catch(SecurityException se){
        //handle it
    }        
    if(result) {    
        System.out.println("DIR created");  
    }
}

240
-1: นั่นเป็นเทคนิคที่เลวร้ายจริงๆในการสร้างไดเรกทอรี การเข้าถึง FS ไม่ได้ถูกสงวนไว้กับทรัพยากรเฉพาะ ระหว่างif(!theDir.exists())และtheDir.mkdir()สถานะอาจมีการเปลี่ยนแปลงเช่นเดียวกับที่อาจมีการเปลี่ยนแปลงในระหว่างไม่สร้างไดเรกทอรี (เพราะexistsกลับมาtrue) และต้องการมัน existsไม่ควรใช้ผลลัพธ์ของวิธีการตัดสินใจในการสร้างไดเรกทอรีหรือไม่ เพียงแค่เรียกจะmkdirไม่มีข้อยกเว้นจะถูกโยนถ้ามันมีอยู่แล้ว
— mwhs

4
@mwhs ฉันเข้าใจดีกว่าถ้าไม่ตรวจสอบไดเรกทอรี แต่ฉันไม่เข้าใจเหตุผลของคุณ (ตอนที่สอง) สถานะไม่สามารถเปลี่ยนระหว่างการโทรmkdirและต้องการไดเรกทอรีได้หรือไม่ ฉันถือว่าคุณหมายความว่ากระบวนการอื่นลบไดเรกทอรี
— Episodex

2
@Episodex Directories เป็นทรัพยากรที่ใช้ร่วมกัน เพียงอย่าใช้วิธีแก้ปัญหาข้างต้นมันผิดด้วยเหตุผลที่แตกต่างกัน ไม่ชัดเจนว่า PO อาจคิดอย่างไรว่านี่เป็นคำตอบที่ถูกต้อง หากคุณต้องการการยืนยันเกี่ยวกับทรัพยากร IO คุณต้องใช้การล็อคไม่ใช่บูลีน
— mwhs

44
@mhws ฉันรู้ว่าโพสต์นี้เก่าสองสามเดือน แต่ถ้าคุณมองไปที่การดำเนินงานจากรหัสที่มาสิ่งแรกที่ได้รับการเรียกว่าmkdirs if (exists()) { return false; }การดำเนินการตรวจสอบตัวเองก่อนเพื่อดูว่าไดเรกทอรีมีอยู่แล้วดังนั้นสิ่งเดียวที่คำตอบนี้เป็นความผิดสำหรับบางทีอาจจะตรวจสอบสภาพ 2x อย่าเข้าใกล้ความเลวร้ายอย่างที่คุณกำลังทำ
— Michael Hogenson

5
ในฐานะของ Java 7 คุณควรใช้วิธีการFilesเหมือนในคำตอบล่าสุดโดย Benoit Blanchon (คำตอบนี้ดูเหมือนว่าจะได้รับการเขียนก่อน Java 7)
— Brick

504
new File("/path/directory").mkdirs();

ที่นี่ "directory" เป็นชื่อของไดเรกทอรีที่คุณต้องการสร้าง / มีอยู่


30
คำตอบที่ดีกว่าคำตอบที่ถูกเลือกโดย OP ตรวจสอบการมีอยู่ของไดเรกทอรีก่อนที่จะสร้างมันควรจะเป็นรูปแบบการต่อต้านที่รู้จักกันดี
— mwhs

7
เกิดอะไรขึ้นถ้าไดเรกทอรีมีอยู่แล้ว? มันจะเขียนทับหรือไม่ หรือข้ามกระบวนการ
— Avinash Raj

3
@AvinashRaj โปรดตรวจสอบdocs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs ()
— Tascalator

1
@Tascalator ไม่ชัดเจนจากเอกสารที่คุณสามารถทำอย่างละเอียด? คำตอบควรเสริมด้วยคำตอบสำหรับwhat if the directory is already exists? It would do overwriting? or skip the process.คำถาม
— mrgloom

3
ก็เป็นที่ชัดเจน:Returns: true if and only if the directory was created, along with all necessary parent directories; false otherwise
— Xerus

146

ด้วย Java 7 Files.createDirectories()คุณสามารถใช้

ตัวอย่างเช่น

Files.createDirectories(Paths.get("/path/to/directory"));

12
ฉันคิดว่าตัวเลือกนี้ไม่มีอยู่ในช่วงเวลาของคำถาม & คำตอบดั้งเดิม แต่นี่ควรเป็นคำตอบที่จะเกิดขึ้นต่อไปฉันคิดว่า
— อิฐ

6
นอกจากนี้ยังเป็นการดีที่จะทราบว่า:Unlike the createDirectory method, an exception is not thrown if the directory could not be created because it already exists
— Keith OYS

ขอบคุณสำหรับการชี้ให้เห็นความแตกต่าง btw createDirectory และ createDirectories ฉันพบว่ามันเป็นตัวเลือกการตั้งชื่อที่ไม่ดี
— seinecle

(2019) ฉันใช้ Files.createDirectory (Paths.get (directory.toString ()))) โดยที่ directory เป็นวัตถุไฟล์ อย่าลืมที่จะจับ IOException ของคุณ
— chrips

@ chrips มันจะดีกว่าที่จะทำdirectory.toPath()แล้ว
— Ruslan Stelmachenko

37

คุณสามารถลองFileUtils # forceMkdir

FileUtils.forceMkdir("/path/directory");

ห้องสมุดนี้มีฟังก์ชั่นที่มีประโยชน์มากมาย


1
ดีกว่า mkdirs บริสุทธิ์มาก: จัดการพร้อมกันตรวจสอบว่าการดำเนินการสำเร็จตรวจสอบว่ามีไดเรกทอรี (ไม่ใช่ไฟล์!) หรือไม่
— Andrey

28

mkdir vs mkdirs


หากคุณต้องการสร้างไดเรกทอรีเดียวให้ใช้ mkdir

new File("/path/directory").mkdir();

หากคุณต้องการสร้างลำดับชั้นของโครงสร้างโฟลเดอร์ให้ใช้ mkdirs

 new File("/path/directory").mkdirs();

21
  1. สร้างไดเรกทอรีเดียว

    new File("C:\\Directory1").mkdir();
  2. สร้างไดเรกทอรีชื่อ“ Directory2 และไดเรกทอรีย่อยทั้งหมด” Sub2″ และ“ Sub-Sub2″ ด้วยกัน

    new File("C:\\Directory2\\Sub2\\Sub-Sub2").mkdirs()

แหล่งที่มา: บทช่วยสอนที่สมบูรณ์แบบนี้คุณจะพบตัวอย่างของการใช้งาน


14

สำหรับ java 7 ขึ้นไป:

Path path = Paths.get("/your/path/string");
Files.createDirectories(path);

ดูเหมือนว่าไม่จำเป็นต้องตรวจสอบการมีอยู่ของ dir หรือไฟล์ก่อนที่จะสร้างจาก createDirectories javadocs :

สร้างไดเรกทอรีโดยสร้างไดเรกทอรีหลักที่ไม่มีอยู่ทั้งหมดก่อน ต่างจากเมธอด createDirectory ข้อยกเว้นจะไม่ถูกโยนทิ้งหากไม่สามารถสร้างไดเร็กทอรีได้เนื่องจากมีอยู่แล้ว พารามิเตอร์ attrs เป็นแอตทริบิวต์ไฟล์ที่เป็นทางเลือกเพื่อตั้งค่าแบบ atom เมื่อสร้างไดเร็กทอรีที่ไม่มีอยู่ แต่ละแอตทริบิวต์ของไฟล์จะถูกระบุด้วยชื่อของมัน หากมีมากกว่าหนึ่งแอ็ตทริบิวต์ที่มีชื่อเดียวกันรวมอยู่ในอาเรย์ดังนั้นทั้งหมด แต่การเกิดครั้งสุดท้ายจะถูกละเว้น

หากวิธีนี้ล้มเหลวอาจเกิดขึ้นหลังจากสร้างไดเรกทอรีหลักบางรายการ แต่ไม่ใช่ทั้งหมด


7

วิธีการต่อไปนี้ควรทำในสิ่งที่คุณต้องการเพียงตรวจสอบให้แน่ใจว่าคุณกำลังตรวจสอบค่าส่งคืนของmkdir () / mkdirs ()

private void createUserDir(final String dirName) throws IOException {
    final File homeDir = new File(System.getProperty("user.home"));
    final File dir = new File(homeDir, dirName);
    if (!dir.exists() && !dir.mkdirs()) {
        throw new IOException("Unable to create " + dir.getAbsolutePath();
    }
}

2
ดังที่ได้กล่าวไว้ในความคิดเห็นโดย @mwhs เกี่ยวกับคำตอบของ Jigar Joshi การตรวจสอบการมีอยู่ครั้งแรกไม่เพียง แต่ไม่จำเป็น แต่เป็นความคิดที่ไม่ดี
— Bdoserror

4

แม้ว่าคำถามนี้จะได้รับคำตอบ ฉันต้องการที่จะเพิ่มสิ่งพิเศษเช่นหากมีไฟล์อยู่กับชื่อไดเรกทอรีที่คุณพยายามสร้างกว่าที่ควรแจ้งข้อผิดพลาด สำหรับผู้เยี่ยมชมในอนาคต

public static void makeDir()
{
    File directory = new File(" dirname ");
    if (directory.exists() && directory.isFile())
    {
        System.out.println("The dir with name could not be" +
        " created as it is a normal file");
    }
    else
    {
        try
        {
            if (!directory.exists())
            {
                directory.mkdir();
            }
            String username = System.getProperty("user.name");
            String filename = " path/" + username + ".txt"; //extension if you need one

        }
        catch (IOException e)
        {
            System.out.println("prompt for error");
        }
    }
}

3
ดังที่ได้กล่าวไว้ในความคิดเห็นโดย @mwhs เกี่ยวกับคำตอบของ Jigar Joshi การตรวจสอบการมีอยู่ครั้งแรกไม่เพียง แต่ไม่จำเป็น แต่เป็นความคิดที่ไม่ดี
— Bdoserror

4

เรียบร้อยและสะอาด:

import java.io.File;

public class RevCreateDirectory {

    public void revCreateDirectory() {
        //To create single directory/folder
        File file = new File("D:\\Directory1");
        if (!file.exists()) {
            if (file.mkdir()) {
                System.out.println("Directory is created!");
            } else {
                System.out.println("Failed to create directory!");
            }
        }
        //To create multiple directories/folders
        File files = new File("D:\\Directory2\\Sub2\\Sub-Sub2");
        if (!files.exists()) {
            if (files.mkdirs()) {
                System.out.println("Multiple directories are created!");
            } else {
                System.out.println("Failed to create multiple directories!");
            }
        }

    }
}

4

ดีในการสร้างไดเรกทอรี / โฟลเดอร์ใน java เรามีสองวิธี

นี่คือวิธี makedirectory สร้างไดเรกทอรีเดียวถ้ามันไม่อยู่

File dir = new File("path name");
boolean isCreated = dir.mkdir();

และ

File dir = new File("path name");
boolean isCreated = dir.mkdirs();

เมธอด makedirectories ที่นี่จะสร้างไดเรกทอรีทั้งหมดที่หายไปในเส้นทางที่วัตถุไฟล์เป็นตัวแทน

ตัวอย่างเช่นลิงค์อ้างอิงด้านล่าง (อธิบายได้ดีมาก) หวังว่ามันจะช่วย !! https://www.flowerbrackets.com/create-directory-java-program/


3

แค่ต้องการชี้ให้ทุกคนโทรFile.mkdir()หรือFile.mkdirs()ระวังFileวัตถุเป็นไดเรกทอรีไม่ใช่ไฟล์ ตัวอย่างเช่นถ้าคุณเรียกmkdirs()หาพา ธ/dir1/dir2/file.txtมันจะสร้างโฟลเดอร์ที่มีชื่อfile.txtซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ หากคุณกำลังสร้างไฟล์ใหม่และต้องการสร้างโฟลเดอร์หลักโดยอัตโนมัติคุณสามารถทำสิ่งนี้:

            File file = new File(filePath);
            if (file.getParentFile() != null) {
                file.getParentFile().mkdirs();
            }

2

วิธีนี้ใช้ได้ผลสำหรับฉันที่ทำไดเรกทอรีเดียวหรือมากกว่านั้น: ต้องนำเข้า java.io.File;
/ * ป้อนรหัสด้านล่างเพื่อเพิ่มไดเรคทอรี่ dir1 หรือตรวจสอบว่ามี dir1 อยู่หรือไม่ถ้าไม่ให้สร้างมันขึ้นมาเหมือนกันกับ dir2 และ dir3 * /

    File filed = new File("C:\\dir1");
    if(!filed.exists()){  if(filed.mkdir()){ System.out.println("directory is created"); }} else{ System.out.println("directory exist");  }

    File filel = new File("C:\\dir1\\dir2");
    if(!filel.exists()){  if(filel.mkdir()){ System.out.println("directory is created");   }} else{ System.out.println("directory exist");  }

    File filet = new File("C:\\dir1\\dir2\\dir3");
    if(!filet.exists()){  if(filet.mkdir()){ System.out.println("directory is  created"); }}  else{ System.out.println("directory exist");  }

0

ฟังก์ชั่นนี้ช่วยให้คุณสร้างไดเรกทอรีในไดเรกทอรีบ้านของผู้ใช้

private static void createDirectory(final String directoryName) {
    final File homeDirectory = new File(System.getProperty("user.home"));
    final File newDirectory = new File(homeDirectory, directoryName);
    if(!newDirectory.exists()) {
        boolean result = newDirectory.mkdir();

        if(result) {
            System.out.println("The directory is created !");
        }
    } else {
        System.out.println("The directory already exist");
    }
}

ดังที่ได้กล่าวไว้ในความคิดเห็นโดย @mwhs เกี่ยวกับคำตอบของ Jigar Joshi การตรวจสอบการมีอยู่ครั้งแรกไม่เพียง แต่ไม่จำเป็น แต่เป็นความคิดที่ไม่ดี
— Bdoserror

0

หากคุณต้องการให้แน่ใจว่ามันถูกสร้างขึ้นแล้วสิ่งนี้:

final String path = "target/logs/";
final File logsDir = new File(path);
final boolean logsDirCreated = logsDir.mkdir();
if (!logsDirCreated) {
    final boolean logsDirExists = logsDir.exists();
    assertThat(logsDirExists).isTrue();
}

เพราะว่า mkDir()ส่งคืนบูลีนและ findbugs จะส่งเสียงร้องหากคุณไม่ใช้ตัวแปร ยังไม่ดี ...

mkDir()ผลตอบแทนที่แท้จริงเท่านั้นถ้าmkDir()สร้างมัน หาก dir มีอยู่มันจะส่งคืนค่าเท็จดังนั้นเพื่อตรวจสอบ dir ที่คุณสร้างขึ้นโทรเฉพาะexists()ถ้าmkDir()คืนเท็จ

assertThat()จะตรวจสอบผลลัพธ์และล้มเหลวหากexists()คืนค่าเป็นเท็จ ofc คุณสามารถใช้สิ่งอื่นเพื่อจัดการกับไดเรกทอรีที่ไม่ถูกสร้างขึ้น


-2
public class Test1 {
    public static void main(String[] args)
    {
       String path = System.getProperty("user.home");
       File dir=new File(path+"/new folder");
       if(dir.exists()){
           System.out.println("A folder with name 'new folder' is already exist in the path "+path);
       }else{
           dir.mkdir();
       }

    }
}

ดังที่ได้กล่าวไว้ในความคิดเห็นโดย @mwhs เกี่ยวกับคำตอบของ Jigar Joshi การตรวจสอบการมีอยู่ครั้งแรกไม่เพียง แต่ไม่จำเป็น แต่เป็นความคิดที่ไม่ดี
— Bdoserror

-7

นอกจากนี้คุณยังสามารถอ้างถึงฟังก์ชั่นmakdir ()เพื่อสร้างไดเรกทอรีใหม่ในโฟลเดอร์ที่คุณต้องการ


9
makdirไม่มีวิธีการตั้งชื่อเป็น หากคุณหมายถึงmkdirจะเพิ่มสิ่งใดไปยังคำตอบที่มีอยู่
— Ted Hopp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.