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

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

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



답변

이 코드는 먼저 디렉토리의 존재를 확인하고 그렇지 않은 경우 생성 한 후 나중에 파일을 생성합니다. 나는 당신의 전체 코드를 가지고 있지 않는 한 내가 좋아하는 것들에 대한 호출을 믿고있어, 그래서 당신의 메서드 호출의 일부를 확인할 수주십시오 노트 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디렉토리가 이미 존재하는 경우를 포함, 그것은 그랬다면 없습니다.


답변

자바 8+ 버전

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

Files.createDirectories

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

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


답변

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

/** 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);
}


답변

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();
}


답변

암호:

// 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);


}


답변

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);
    }


답변

웹 기반 응용 프로그램을 만드는 경우 더 나은 해결책은 디렉터리가 있는지 확인한 다음 파일이 없으면 파일을 만드는 것입니다. 존재하는 경우 다시 작성하십시오.

    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;
   }