존재하지 않는 경우 디렉터리를 만든 다음 해당 디렉터리에 파일도 만듭니다.


112

조건은 디렉토리가 존재하는 경우 새 디렉토리를 생성하지 않고 해당 특정 디렉토리에 파일을 생성해야한다는 것입니다.

아래 코드는 기존 디렉토리가 아닌 새 디렉토리로 파일을 생성합니다. 예를 들어 디렉토리 이름은 "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();

답변:


172

이 코드는 먼저 디렉토리의 존재를 확인하고 그렇지 않은 경우 생성 한 후 나중에 파일을 생성합니다. 나는 당신의 전체 코드를 가지고 있지 않는 한 내가 좋아하는 것들에 대한 호출을 믿고있어, 그래서 당신의 메서드 호출의 일부를 확인할 수주십시오 노트 getTimeStamp()getClassName()작동합니다. 또한 클래스 중 하나를 IOException사용할 때 발생할 수있는 가능한 작업을 수행해야 java.io.*합니다. 파일을 작성하는 함수가이 예외를 throw해야하고 (그리고 다른 곳에서 처리해야 함) 메서드에서 직접 수행해야합니다. 또한 나는 그것이 id유형 이라고 가정 String했습니다. 귀하의 코드가 명시 적으로 정의하지 않았기 때문에 모르겠습니다. .과 같은 다른 경우 여기에서 한 것처럼 fileName에서 사용하기 전에 int캐스트해야 String합니다.

또한 적절하다고 판단한대로 귀하의 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디렉토리가 이미 존재하는 경우를 포함, 그것은 그랬다면 없습니다.


통화가 잘 작동합니다. 내가 위의 남녀 공학을 시도했을 때 여전히 파일을 PATH에 쓰고 있지만 디렉토리에는 기록하지 않습니다. 새 파일 생성을 위해 File.seperator를 사용했습니다.
Sri

예상되는 출력을 정확히 설명하십시오 (클래스 이름 및 샘플 변수 포함). 여기에 내 예제 프로그램 전체를 pastebin.com/3eEg6jQv 에 첨부 하여 설명하는 내용을 수행하는지 확인할 수 있습니다 (내가 이해하는 한 가장 잘).
Aaron D

1
파일 파일 = new File (directoryName + "/"+ fileName); 위의 코드 조각을 StringBuffer fullFilePath = new StringBuffer (directoryName) .append (File.separator) .append (fileName); 파일 파일 = new File (String.valueOf (fullFilePath)); 그리고 작동했습니다
Sri

이 경우 mkdirs()방법을 사용할 수 있습니다 .
Aaron D

3
디렉토리의 존재를 확인해야하는 이유는 무엇입니까? 나는 이것을 가지고 놀았고 내가 볼 수있는 한 동일한 디렉토리를 두 ​​번 만들면 차이가없는 것 같습니다. 포함 된 파일도 덮어 쓰지 않습니다. 내가 뭔가를 놓치고 있습니까?
JosefScript

75

자바 8+ 버전

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

Files.createDirectories

존재하지 않는 새 디렉토리와 상위 디렉토리를 만듭니다.

디렉토리가 이미 존재하는 경우 메소드에서 예외가 발생하지 않습니다.


5
이것이 최고의 답변입니다
somshivam

생성에 권한이 필요한 경우 어떻게됩니까?
Ajay Takur

Android의 경우 API 26 이상에서만 작동하므로 (Build.VERSION.SDK_INT> = Build.VERSION_CODES.O) developer.android.com/reference/java/nio/file/…
Arpit Patel 인

24

가능한 한 짧고 간단하게 만들려고합니다. 디렉토리가 존재하지 않는 경우 생성 한 다음 원하는 파일을 반환합니다.

/** 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이유.
대격변

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.