Files.createDirectory():FileAlreadyExistsException

时间:2013-04-23 21:01:30

标签: java file-io java-7

使用Java 7的Files类,我有一个看似奇怪的问题。 我想在开始编写之前确保我的目录和文件存在以避免FileNotFoundException,并根据JavadocscreateDirectory检查“文件的存在和创建目录,如果它不存在“

因此,如果它首先检查,为什么在目录已存在时,我对以下代码有疑问?

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)

5 个答案:

答案 0 :(得分:20)

来自documentation

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

“首先通过创建所有不存在的父目录来创建目录。与createDirectory方法不同,如果由于目录已经存在而无法创建目录,则不会引发异常。”

也许你可以使用那个

答案 1 :(得分:1)

Files.createDirectory实际上创建了目录 - &gt; “创建一个新目录....应该在需要首先创建所有不存在的父目录的地方使用createDirectories方法。”

如果要确保文件存在,只需使用file.exists()方法

答案 2 :(得分:0)

Java 7 documentation已经提到你会获得FileAlreadyExistsException。那似乎是什么问题?

答案 3 :(得分:0)

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

首先检查然后创建!

答案 4 :(得分:0)

我使用public static Path createDirectories(Path dir, FileAttribute<?>... attrs) throws IOException并仍然得到java.nio.file.FileAlreadyExistsException,因为现有文件之一是符号链接。该方法不是很可靠。