ディレクトリが存在しない場合は作成し、そのディレクトリにもファイルを作成します


103

条件は、ディレクトリが存在する場合、新しいディレクトリを作成せずに、その特定のディレクトリにファイルを作成する必要があることです。

以下のコードは、既存のディレクトリではなく、新しいディレクトリでファイルを作成するだけです。たとえば、ディレクトリ名は「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();

回答:


161

このコードは、最初にディレクトリの存在を確認し、存在しない場合は作成し、後でファイルを作成します。私はあなたの完全なコードを持っていないとして、私はのようなものへの呼び出しを想定していますので、あなたのメソッド呼び出しのいくつかを確認することができなかったことをしてくださいは、ノートgetTimeStamp()getClassName()動作します。またIOExceptionjava.io.*クラスのいずれかを使用するときにスローされる可能性があることで何かを行う必要があります-ファイルを書き込む関数がこの例外をスローする(そして他の場所で処理する)か、メソッドで直接実行する必要があります。また、私はそれ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ディレクトリがすでに存在していた場合も含め、それがなかった場合ではありません。


通話は正常に機能しています。上記のcoedを試しましたが、ファイルはまだPATHに書き込まれていますが、ディレクトリには書き込まれていません。新しいファイルの作成にはFile.seperatorを使用しました。
スリ

期待される出力を(クラス名とサンプル変数を使用して)正確に説明してください。私のサンプルプログラムをここに完全に添付しました。ここには、pastebin.com / 3eEg6jQvが含まれています。これにより、あなたが説明していることがわかります(理解できる限り)。
アーロンD

1
ファイルfile = new File(directoryName + "/" + fileName); 上記のコードスニペットをStringBufferに置き換えましたfullFilePath = new StringBuffer(directoryName).append(File.separator).append(fileName); ファイルfile = new File(String.valueOf(fullFilePath)); そしてそれは働いた
Sri

その場合、mkdirs()メソッドを使用できます。
アーロンD

3
なぜディレクトリの存在を確認する必要があるのですか?私はこれをいじってみましたが、同じディレクトリを2回作成しても、確認できる限り違いはないようです。含まれているファイルでも上書きされません。何か不足していますか?
JosefScript 2017年

57

Java 8+バージョン

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

Files.createDirectories

存在しない新しいディレクトリと親ディレクトリを作成します。

ディレクトリがすでに存在する場合、メソッドは例外をスローしません。


2
これが最良の答えです
somshivam

作成に許可が必要な場合はどうなりますか?
Ajay Takur

23

これを可能な限り短くシンプルにしようとしています。存在しない場合はディレクトリを作成し、目的のファイルを返します。

/** 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

21

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 2019年

6

コード:

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


}

4

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

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;
   }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.