วิธีสร้างไดเรกทอรีใน 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.