สร้างไดเร็กทอรีหากไม่มีอยู่แล้วสร้างไฟล์ในไดเร็กทอรีนั้นด้วย


119

เงื่อนไขคือถ้ามีไดเร็กทอรีจะต้องสร้างไฟล์ในไดเร็กทอรีเฉพาะนั้นโดยไม่ต้องสร้างไดเร็กทอรีใหม่

โค้ดด้านล่างนี้สร้างเฉพาะไฟล์ที่มีไดเร็กทอรีใหม่ แต่ไม่ใช่สำหรับไดเร็กทอรีที่มีอยู่ ตัวอย่างเช่นชื่อไดเรกทอรีจะเป็น "GETDIRECTION"

String PATH = "/remote/dir/server/";

String fileName = PATH.append(id).concat(getTimeStamp()).append(".txt");  

String directoryName = PATH.append(this.getClassName());   

File file  = new File(String.valueOf(fileName));

File directory = new File(String.valueOf(directoryName));

 if(!directory.exists()){

             directory.mkdir();
            if(!file.exists() && !checkEnoughDiskSpace()){
                file.getParentFile().mkdir();
                file.createNewFile();
            }
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(value);
bw.close();

คำตอบ:


181

รหัสนี้ตรวจสอบการมีอยู่ของไดเร็กทอรีก่อนและสร้างขึ้นหากไม่มีและสร้างไฟล์ในภายหลัง โปรดทราบว่าฉันไม่สามารถตรวจสอบการเรียกใช้วิธีการบางอย่างของคุณได้เนื่องจากฉันไม่มีรหัสที่สมบูรณ์ของคุณดังนั้นฉันจึงถือว่าการโทรไปยังสิ่งต่างๆเช่นgetTimeStamp()และgetClassName()จะได้ผล นอกจากนี้คุณควรทำบางสิ่งบางอย่างด้วยความเป็นไปได้IOExceptionที่สามารถโยนทิ้งได้เมื่อใช้java.io.*คลาสใด ๆ- ไม่ว่าฟังก์ชันของคุณที่เขียนไฟล์ควรโยนข้อยกเว้นนี้ (และจัดการที่อื่น) หรือคุณควรทำในเมธอดโดยตรง นอกจากนี้ฉันคิดว่าidเป็นประเภทString- ฉันไม่รู้เนื่องจากรหัสของคุณไม่ได้กำหนดไว้อย่างชัดเจน หากเป็นอย่างอื่นเช่นintคุณควรส่งไปยัง a Stringก่อนที่จะใช้ใน fileName ตามที่ฉันได้ทำไว้ที่นี่

นอกจากนี้ฉันเปลี่ยนappendสายของคุณด้วยconcatหรือ+ตามที่เห็นว่าเหมาะสม

public void writeFile(String value){
    String PATH = "/remote/dir/server/";
    String directoryName = PATH.concat(this.getClassName());
    String fileName = id + getTimeStamp() + ".txt";

    File directory = new File(directoryName);
    if (! directory.exists()){
        directory.mkdir();
        // If you require it to make the entire directory path including parents,
        // use directory.mkdirs(); here instead.
    }

    File file = new File(directoryName + "/" + fileName);
    try{
        FileWriter fw = new FileWriter(file.getAbsoluteFile());
        BufferedWriter bw = new BufferedWriter(fw);
        bw.write(value);
        bw.close();
    }
    catch (IOException e){
        e.printStackTrace();
        System.exit(-1);
    }
}

คุณไม่ควรใช้ชื่อพา ธ เปล่าเช่นนี้หากคุณต้องการเรียกใช้รหัสบน Microsoft Windows - ฉันไม่แน่ใจว่าจะทำอะไรกับ/ชื่อไฟล์ในชื่อไฟล์ เพื่อความสะดวกในการพกพาคุณควรใช้File.separatorเพื่อสร้างเส้นทางของคุณ

แก้ไข : ตามความคิดเห็นของJosefScriptด้านล่างไม่จำเป็นต้องทดสอบการมีอยู่ของไดเร็กทอรี การdirectory.mkdir() เรียกจะส่งคืนtrueหากมีการสร้างไดเร็กทอรีและfalseไม่รวมถึงกรณีที่มีไดเร็กทอรีอยู่แล้ว


การโทรใช้งานได้ดี เมื่อฉันลองด้านบนของ coed มันยังคงเขียนไฟล์ไปยัง PATH แต่ไม่ใช่ในไดเร็กทอรี ฉันใช้ File.seperator สำหรับการสร้างไฟล์ใหม่
ศรี

กรุณาอธิบายให้แน่ชัด (พร้อมชื่อคลาสและตัวแปรตัวอย่าง) ว่าคุณคาดหวังผลลัพธ์อะไร ฉันได้แนบโปรแกรมตัวอย่างของฉันไว้ที่นี่pastebin.com/3eEg6jQvเพื่อให้คุณเห็นว่ามันทำตามที่คุณอธิบาย (ดีที่สุดเท่าที่ฉันเข้าใจ)
Aaron D

1
ไฟล์ไฟล์ = ไฟล์ใหม่ (directoryName + "/" + fileName); ฉันแทนที่ข้อมูลโค้ดด้านบนด้วย StringBuffer fullFilePath = ใหม่ StringBuffer (directoryName) .append (File.separator) .append (fileName); ไฟล์ไฟล์ = ไฟล์ใหม่ (String.valueOf (fullFilePath)); และได้ผล
ศรี

3
ทำไมคุณต้องตรวจสอบการมีอยู่ของไดเรกทอรี? ฉันเล่นกับสิ่งนี้และเท่าที่ฉันเห็นมันดูเหมือนจะไม่สร้างความแตกต่างถ้าฉันสร้างไดเร็กทอรีเดียวกันสองครั้ง แม้แต่ไฟล์ที่มีก็จะไม่ถูกเขียนทับ ฉันพลาดอะไรไปรึเปล่า?
JosefScript

1
เท่าที่ฉันรู้ Java (อย่างน้อย Java 8) มีความสุขกับการใช้เครื่องหมายทับเป็นตัวคั่นไดเร็กทอรีทั้งใน Windows และ Linux (อย่างชัดเจน)
Jared

98

เวอร์ชัน Java 8+:

Files.createDirectories(Paths.get("/Your/Path/Here"));

Files.createDirectories()สร้างไดเรกทอรีและผู้ปกครองใหม่ไดเรกทอรีที่ไม่อยู่ วิธีนี้จะไม่ทำให้เกิดข้อยกเว้นหากมีไดเร็กทอรีอยู่แล้ว


6
นี่คือคำตอบที่ดีที่สุด
somshivam

จะเกิดอะไรขึ้นหากต้องได้รับอนุญาตในการสร้าง
Ajay Takur

1
สำหรับ Android ใช้งานได้กับ API 26 ขึ้นไปเท่านั้นดังนั้นอย่าลืมตรวจสอบบรรทัดนี้หาก (Build.VERSION.SDK_INT> = Build.VERSION_CODES.O) developer.android.com/reference/java/nio/file/…
Arpit Patel

@AjayTakur หากคุณไม่มีสิทธิ์เขียนในไดเร็กทอรีที่คุณกำลังพยายามสร้างไดเร็กทอรีใหม่มันจะพ่น IOException
Thor Lancaster

นี่ควรเป็นคำตอบที่ยอมรับ
nomadSK25

25

พยายามทำให้สั้นและเรียบง่ายที่สุด สร้างไดเร็กทอรีหากไม่มีอยู่จากนั้นส่งคืนไฟล์ที่ต้องการ:

/** Creates parent directories if necessary. Then returns file */
private static File fileWithDirectoryAssurance(String directory, String filename) {
    File dir = new File(directory);
    if (!dir.exists()) dir.mkdirs();
    return new File(directory + "/" + filename);
}

9
ชอบใช้ File.separatorChar แทน "/"
cactuschibre

23

ฉันขอแนะนำสิ่งต่อไปนี้สำหรับ Java8 +

/**
 * Creates a File if the file does not exist, or returns a
 * reference to the File if it already exists.
 */
private File createOrRetrieve(final String target) throws IOException{

    final Path path = Paths.get(target);

    if(Files.notExists(path)){
        LOG.info("Target file \"" + target + "\" will be created.");
        return Files.createFile(Files.createDirectories(path)).toFile();
    }
    LOG.info("Target file \"" + target + "\" will be retrieved.");
    return path.toFile();
}

/**
 * Deletes the target if it exists then creates a new empty file.
 */
private File createOrReplaceFileAndDirectories(final String target) throws IOException{

    final Path path = Paths.get(target);
    // Create only if it does not exist already
    Files.walk(path)
        .filter(p -> Files.exists(p))
        .sorted(Comparator.reverseOrder())
        .peek(p -> LOG.info("Deleted existing file or directory \"" + p + "\"."))
        .forEach(p -> {
            try{
                Files.createFile(Files.createDirectories(p));
            }
            catch(IOException e){
                throw new IllegalStateException(e);
            }
        });

    LOG.info("Target file \"" + target + "\" will be created.");

    return Files.createFile(
        Files.createDirectories(path)
    ).toFile();
}

1
Files.createFile(Files.createDirectories(path)).toFile()ควรจะเป็นFiles.createDirectories(path).toFile()สำหรับAccess Deniedเหตุผล
Cataclysm

1
@Pytry Files.createFile(Files.createDirectories(path))ไม่ทำงานตามที่อธิบายไว้ในความคิดเห็นด้านบน createDirectoriesสร้างไดเร็กทอรีที่มีชื่อไฟล์แล้วเช่น "test.txt" ดังนั้นcreateFileจะล้มเหลว
Marcono1234

7

รหัส:

// Create Directory if not exist then Copy a file.


public static void copyFile_Directory(String origin, String destDir, String destination) throws IOException {

    Path FROM = Paths.get(origin);
    Path TO = Paths.get(destination);
    File directory = new File(String.valueOf(destDir));

    if (!directory.exists()) {
        directory.mkdir();
    }
        //overwrite the destination file if it exists, and copy
        // the file attributes, including the rwx permissions
     CopyOption[] options = new CopyOption[]{
                StandardCopyOption.REPLACE_EXISTING,
                StandardCopyOption.COPY_ATTRIBUTES

        };
        Files.copy(FROM, TO, options);


}

5

การใช้java.nio.Pathมันค่อนข้างง่าย -

public static Path createFileWithDir(String directory, String filename) {
        File dir = new File(directory);
        if (!dir.exists()) dir.mkdirs();
        return Paths.get(directory + File.separatorChar + filename);
    }

0

หากคุณสร้างแอปพลิเคชันบนเว็บวิธีแก้ปัญหาที่ดีกว่าคือตรวจสอบไดเร็กทอรีว่ามีอยู่หรือไม่จากนั้นสร้างไฟล์หากไม่มี หากมีอยู่ให้สร้างใหม่อีกครั้ง

    private File createFile(String path, String fileName) throws IOException {
       ClassLoader classLoader = getClass().getClassLoader();
       File file = new File(classLoader.getResource(".").getFile() + path + fileName);

       // Lets create the directory
       try {
          file.getParentFile().mkdir();
       } catch (Exception err){
           System.out.println("ERROR (Directory Create)" + err.getMessage());
       }

       // Lets create the file if we have credential
       try {
           file.createNewFile();
       } catch (Exception err){
           System.out.println("ERROR (File Create)" + err.getMessage());
       }
       return  file;
   }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.