web-dev-qa-db-ja.com

Files.createDirectory():FileAlreadyExistsException

Java 7のFilesクラスを使用すると、一見奇妙な問題が発生します。FileNotFoundExceptionを回避するために、書き込みを開始する前にディレクトリとファイルが存在することを確認したいと思います。 Javadocs によると、createDirectoryは、「ファイルの存在と、存在しない場合はディレクトリの作成」をチェックします。

それで、最初にチェックする場合、ディレクトリがすでに存在するのに、なぜ次のコードで問題が発生するのですか?

private void writeFile() throws IOException {
    // Make sure parent directory and file are ready
    File file = "mydirectory/my.file";
    File parent = file.getParentFile();
    if (parent != null)
        Files.createDirectory(parent.toPath()); // Why do I get FileAlreadyExistsException? =[
    Files.createFile(file.toPath());

    // Do some file writing stuff!
}

「ファイルが存在しない場合は作成する」ことだけができることはわかっていますが、この方法の要点はすべてを処理することだと思いました。

例外データ:

Java.nio.file.FileAlreadyExistsException: mydirectory
at Sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
at Sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
at Sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
at Sun.nio.fs.WindowsFileSystemProvider.createDirectory(Unknown Source)
at Java.nio.file.Files.createDirectory(Unknown Source)
9
CJxD

ドキュメント から

public static Path createDirectories(Path dir, FileAttribute<?>... attrs) throws IOException

「最初に存在しないすべての親ディレクトリを作成してディレクトリを作成します。createDirectoryメソッドとは異なり、ディレクトリがすでに存在するために作成できなかった場合でも、例外はスローされません。」

多分あなたはそれを使うことができます

21
Mathter

Files.createDirectoryは、実際にディレクトリを作成します->「新しいディレクトリを作成します。...存在しないすべての親ディレクトリを最初に作成する必要がある場合は、createDirectoriesメソッドを使用する必要があります。」

ファイルが存在することを確認したい場合は、file.exists()メソッドを使用してください。

1
drewich
if (!Files.isDirectory(Paths.get(dirpath))) {
    System.out.println("Output Files parent path does not exist:"+dirpath);
    File file = new File(dirpath);
    if (!file.exists()) {
        if (file.mkdir()) {
            System.out.println("Output files directory is created!");
        } else {
            System.out.println("Failed to create output directory!");
        }
    }
}

まずチェックしてから作成!!

0
PradeeP AgrawaL

public static Path createDirectories(Path dir, FileAttribute<?>... attrs) throws IOExceptionを使用しましたが、それでもJava.nio.file.FileAlreadyExistsException既存のファイルの1つがシンボリックリンクだったため。この方法はあまり信頼できません。

0
raisercostin

Java 7 documentation は、FileAlreadyExistsExceptionを取得することをすでに述べています。では、何が問題だと思われますか?

0
Pradeep Pati