如果目录不存在,请创建一个目录,然后在该目录中也创建文件


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

Answers:


161

此代码首先检查目录是否存在,如果不存在,则创建该目录,然后创建该文件。请注意,由于我没有完整的代码,因此我无法验证您的某些方法调用,因此,我假设对getTimeStamp()和这样的事情getClassName()都可以使用。IOException使用任何java.io.*类时,您还应该做一些可能抛出的事情-写文件的函数应该抛出此异常(并在其他地方处理),或者您应该直接在方法中执行此异常。另外,我假设这id是类型String-我不知道,因为您的代码未明确定义它。如果是类似的东西int,您可能应该将其转换为,String然后再在fileName中使用它,就像我在这里所做的那样。

另外,我appendconcat+认为合适代替了您的电话。

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如果没有,包括在这个目录已经存在的情况下。


通话正常。当我尝试上述操作时,它仍在将文件写入PATH而不是目录中。我已经使用File.seperator来创建新文件。
斯里兰卡

请准确地(使用类名和示例变量)说明您期望的输出。我在此处完整粘贴了示例程序,pastebin.com / 3eEg6jQv,因此您可以看到它符合您的描述(据我所知)。
亚伦D

1
File file = new File(directoryName +“ /” + fileName); 我用StringBuffer fullFilePath = new StringBuffer(directoryName).append(File.separator).append(fileName);替换了上面的代码片段;文件文件=新文件(String.valueOf(fullFilePath)); 它奏效了
斯里兰卡2015年

在这种情况下,您可以使用该mkdirs()方法。
亚伦D

3
为什么必须检查目录的存在?我试了一下,据我所知,如果我两次创建相同的目录,似乎没有什么不同。即使包含的文件也不会被覆盖。我想念什么吗?
JosefScript

56

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 '19

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;
   }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.