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 crée uniquement un fichier avec un nouveau répertoire mais pas pour un répertoire existant. Par exemple, le nom du répertoire ressemblerait à "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();
Ce code vérifie d'abord l'existence du répertoire et le crée sinon, puis crée le fichier. Veuillez noter que je ne peux pas vérifier certains de vos appels de méthode car je ne dispose pas de votre code complet. Je suppose donc que les appels à des éléments tels que getTimeStamp()
et getClassName()
fonctionneront. Vous devriez aussi faire quelque chose avec le IOException
possible qui peut être levé en utilisant l’une des classes Java.io.*
- soit votre fonction qui écrit les fichiers lève cette exception (et elle sera gérée ailleurs), ou vous devrait le faire directement dans la méthode. De plus, j'ai supposé que id
est de type String
- je ne le sais pas car votre code ne le définit pas explicitement. S'il s'agit de quelque chose d'autre comme un int
, vous devriez probablement le convertir en un String
avant de l'utiliser dans le nom de fichier, comme je l'ai fait ici.
De plus, j’ai remplacé vos appels append
par concat
ou +
comme j’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 des noms de chemin nus comme celui-ci si vous voulez exécuter le code sous Microsoft Windows. Je ne sais pas ce qu'il fera avec le /
dans les noms de fichiers. Pour une portabilité totale, vous devriez probablement utiliser quelque chose comme File.separator pour construire vos chemins.
Edit : d'après un commentaire de JosefScript ci-dessous, il n'est pas nécessaire de tester l'existence d'un répertoire. L'appel directory.mkdir()
renverra true
s'il a créé un répertoire et false
s'il ne l'a pas été, y compris le cas où le répertoire existait déjà.
Je suggère 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();
}
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);
}
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);
}
En utilisant Java.nio.Path
ce serait 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);
}