Créez un répertoire s'il n'existe pas, puis créez également les fichiers dans ce répertoire

104

La condition est que si le répertoire existe, il doit créer des fichiers dans ce répertoire spécifique sans créer un nouveau répertoire.

Le code ci-dessous ne crée qu'un fichier avec un nouveau répertoire mais pas pour un répertoire existant. Par exemple, le nom du répertoire serait comme "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
la source

Réponses:

161

Ce code vérifie d'abord l'existence du répertoire et le crée dans le cas contraire, puis crée le fichier par la suite. Veuillez noter que je n'ai pas pu vérifier certains de vos appels de méthode car je n'ai pas votre code complet, donc je suppose que les appels à des choses comme getTimeStamp()et getClassName()fonctionneront. Vous devez également faire quelque chose avec le possible IOExceptionqui peut être levé lors de l'utilisation de l'une des java.io.*classes - soit votre fonction qui écrit les fichiers doit lever cette exception (et elle doit être gérée ailleurs), soit vous devez le faire directement dans la méthode. De plus, j'ai supposé que c'était idde type String- je ne sais pas car votre code ne le définit pas explicitement. Si c'est autre chose comme an int, vous devriez probablement le convertir en a Stringavant de l'utiliser dans le fileName comme je l'ai fait ici.

De plus, j'ai remplacé vos appendappels par concatou +comme je l'ai jugé approprié.

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

Vous ne devriez probablement pas utiliser de noms de chemins nus comme celui-ci si vous souhaitez exécuter le code sur Microsoft Windows - je ne suis pas sûr de ce qu'il fera avec /les noms de fichiers. Pour une portabilité totale, vous devriez probablement utiliser quelque chose comme File.separator pour construire vos chemins.

Edit : Selon un commentaire de JosefScript ci-dessous, il n'est pas nécessaire de tester l'existence d'un répertoire. L' directory.mkdir() appel sera renvoyé trues'il a créé un répertoire, et falses'il ne l'a pas fait, y compris le cas où le répertoire existait déjà.

Aaron D
la source
les appels fonctionnent bien. Quand j'ai essayé le morceau ci-dessus de étudiante, il écrit toujours le fichier dans PATH mais pas dans le répertoire. J'ai utilisé le File.seperator pour la nouvelle création de fichier.
Sri
Veuillez expliquer exactement (avec les noms de classe et les exemples de variables) le résultat que vous attendez. J'ai joint mon exemple de programme dans son intégralité ici pastebin.com/3eEg6jQv afin que vous puissiez voir qu'il fait ce que vous décrivez (du mieux que je comprends).
Aaron D
1
Fichier fichier = nouveau fichier (nom_répertoire + "/" + nom fichier); J'ai remplacé l'extrait de code ci-dessus par StringBuffer fullFilePath = new StringBuffer (directoryName) .append (File.separator) .append (fileName); Fichier fichier = nouveau fichier (String.valueOf (fullFilePath)); et ça a marché
Sri
Dans ce cas, vous pouvez utiliser la mkdirs()méthode.
Aaron D
3
Pourquoi devez-vous vérifier l'existence de l'annuaire? J'ai joué avec cela et pour autant que je puisse voir, cela ne semble pas faire de différence, si je crée le même répertoire deux fois. Même les fichiers contenus ne seront pas écrasés. Est-ce que je manque quelque chose?
JosefScript
57

version java 8+

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

Les Files.createDirectories

crée un nouveau répertoire et des répertoires parents qui n'existent pas.

La méthode ne lève pas d'exception si le répertoire existe déjà.

Inês Gomes
la source
2
C'est la meilleure réponse
somshivam
Que se passe-t-il si une autorisation est requise pour créer?
Ajay Takur le
23

Essayer de rendre cela aussi court et simple que possible. Crée un répertoire s'il n'existe pas, puis renvoie le fichier souhaité:

/** 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
la source
9
Préférez utiliser File.separatorChar au lieu de "/".
cactuschibre
22

Je suggérerais ce qui suit pour 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
la source
1
Files.createFile(Files.createDirectories(path)).toFile()devrait être Files.createDirectories(path).toFile()pour Access Deniedraison.
Cataclysm
1
@Pytry, Files.createFile(Files.createDirectories(path))ne fonctionne pas comme décrit dans le commentaire ci-dessus. createDirectoriescrée déjà un répertoire avec le nom de fichier, par exemple "test.txt", donc createFileéchouera.
Marcono1234
6

code:

// 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
la source
4

L'utiliser java.nio.Pathserait assez simple -

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
la source
0

Si vous créez une application Web, la meilleure solution est de vérifier que le répertoire existe ou non, puis de créer le fichier s'il n'existe pas. S'il existe, recréez à nouveau.

    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
la source