Crie um diretório se ele não existir e, em seguida, crie os arquivos nesse diretório também

104

A condição é que se o diretório existe, ele deve criar arquivos naquele diretório específico sem criar um novo diretório.

O código a seguir cria apenas um arquivo com o novo diretório, mas não para o diretório existente. Por exemplo, o nome do diretório seria como "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();
Sri
fonte

Respostas:

161

Este código verifica primeiro a existência do diretório e o cria, caso contrário, e cria o arquivo depois. Observe que não pude verificar algumas de suas chamadas de método, pois não tenho seu código completo, então estou assumindo que as chamadas para coisas como getTimeStamp()e getClassName()funcionarão. Você também deve fazer algo com o possível IOExceptionque pode ser lançado ao usar qualquer uma das java.io.*classes - ou sua função que grava os arquivos deve lançar essa exceção (e ser tratada em outro lugar), ou você deve fazer isso no método diretamente. Além disso, presumi que idseja do tipo String- não sei, pois seu código não o define explicitamente. Se for algo como um int, você provavelmente deve convertê-lo em a Stringantes de usá-lo no fileName, como fiz aqui.

Além disso, substituí suas appendligações por concatou +conforme achei apropriado.

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

Você provavelmente não deve usar nomes de caminho simples como este se quiser executar o código no Microsoft Windows - não tenho certeza do que fará com o /nos nomes de arquivo. Para portabilidade total, você provavelmente deve usar algo como File.separator para construir seus caminhos.

Edit : De acordo com um comentário de JosefScript abaixo, não é necessário testar a existência de diretório. A directory.mkdir() chamada retornará truese criou um diretório e, falsecaso não o tenha feito, incluindo o caso em que o diretório já existia.

Aaron D
fonte
as ligações estão funcionando bem. Quando tentei o pedaço de coed acima, ele ainda está gravando o arquivo no PATH, mas não no diretório. Usei o File.seperator para a criação do novo arquivo.
Sri
Explique exatamente (com nomes de classe e variáveis ​​de amostra) qual saída você está esperando. Anexei meu programa de exemplo completo aqui pastebin.com/3eEg6jQv para que você possa ver que ele faz o que você está descrevendo (tanto quanto eu entendo).
Aaron D
1
File file = new File (directoryName + "/" + fileName); substituí o trecho de código acima por StringBuffer fullFilePath = new StringBuffer (directoryName) .append (File.separator) .append (fileName); Arquivo arquivo = novo arquivo (String.valueOf (fullFilePath)); e funcionou
Sri
Nesse caso, você pode usar o mkdirs()método.
Aaron D de
3
Por que você tem que verificar a existência do diretório? Eu brinquei com isso e até onde posso ver não parece fazer diferença, se eu criar o mesmo diretório duas vezes. Mesmo os arquivos contidos não serão substituídos. Estou esquecendo de algo?
JosefScript
57

versão java 8+

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

Os Files.createDirectories

cria um novo diretório e diretórios pais que não existem.

O método não lança uma exceção se o diretório já existir.

Inês Gomes
fonte
2
Esta é a melhor resposta
somshivam
O que acontece se for necessária permissão para criar?
Ajay Takur
23

Tentando fazer isso o mais curto e simples possível. Cria um diretório se ele não existir e retorna o arquivo desejado:

/** 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);
}
Jacob R
fonte
9
Prefira usar File.separatorChar em vez de "/".
cactuschibre
22

Eu sugeriria o seguinte para 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();
}
Pytry
fonte
1
Files.createFile(Files.createDirectories(path)).toFile()deve ser Files.createDirectories(path).toFile()por uma Access Deniedrazão.
Cataclismo
1
@Pytry, Files.createFile(Files.createDirectories(path))não funciona conforme descrito no comentário acima. createDirectoriesjá cria um diretório com o nome do arquivo, por exemplo, "test.txt", portanto createFileirá falhar.
Marcono1234
6

código:

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


}
Mukesh
fonte
4

Usá- java.nio.Pathlo seria bastante simples -

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);
    }
Saikat
fonte
0

Se você criar um aplicativo baseado na web, a melhor solução é verificar se o diretório existe ou não e, em seguida, criar o arquivo se ele não existir. Se existir, recrie novamente.

    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;
   }
Dr. X
fonte