IT

디렉토리가 존재하지 않는 경우는, 그 디렉토리에 파일을 작성합니다.

itgroup 2023. 1. 21. 09:43
반응형

디렉토리가 존재하지 않는 경우는, 그 디렉토리에 파일을 작성합니다.

디렉토리가 존재하는 경우는, 새로운 디렉토리를 작성하지 않고, 그 특정의 디렉토리에 파일을 작성할 필요가 있습니다.

다음 코드는 새 디렉토리를 가진 파일만 생성하며 기존 디렉토리용 파일은 생성하지 않습니다.예를 들어 디렉토리 이름은 "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.*classes - 파일을 쓰는 함수에서 이 예외가 발생하거나(다른 곳에서 처리됨) 메서드로 직접 수행해야 합니다.또, 저는 이렇게 생각했다.id종류String당신의 코드에 명확하게 정의되어 있지 않기 때문에 잘 모르겠습니다.만약 그게 다른 것이라면int, 아마도 당신은 그것을 에 던져야 할 것이다.StringfileName에서 사용하기 전에 여기를 참조하십시오.

그리고, 나는 너의 것을 교체했다.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 로 코드를 실행하는 경우는, 이러한 베어 패스명을 사용하지 않는 것이 좋습니다.이러한 패스명이, Microsoft Windows 로 무엇을 실행할지는 잘 모르겠습니다./파일명으로.완전한 휴대성을 위해 File.separator 등의 기능을 사용하여 경로를 구성해야 합니다.

편집: 아래 JosefScript의 코멘트에 따르면 디렉토리의 존재 여부를 테스트할 필요가 없습니다.directory.mkdir()콜이 반환됩니다.true디렉토리가 생성된 경우,false디렉토리가 이미 존재했던 경우를 포함하여, 그렇지 않은 경우.

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

Web 베이스의 애플리케이션을 작성하는 경우는, 디렉토리의 유무를 확인해, 존재하지 않는 경우는 파일을 작성하는 것이 좋습니다.존재하는 경우는, 다시 작성합니다.

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

언급URL : https://stackoverflow.com/questions/28947250/create-a-directory-if-it-does-not-exist-and-then-create-the-files-in-that-direct

반응형