Je veux supprimer tous les fichiers du répertoire ABC.
Lorsque j'ai essayé avec FileUtils.deleteDirectory(new File("C:/test/ABC/"));
, il supprime également le dossier ABC.
Existe-t-il une solution unique permettant de supprimer des fichiers dans un répertoire mais pas dans un répertoire?
_FileUtils.cleanDirectory(directory);
_
Il y a cette méthode disponible dans le même fichier. Cela supprimera également de manière récursive tous les sous-dossiers et fichiers qu'ils contiennent.
Tu veux dire comme?
for(File file: dir.listFiles())
if (!file.isDirectory())
file.delete();
Cela ne supprimera que les fichiers, pas les répertoires.
La réponse de Peter Lawrey est excellente parce que c'est simple et ne dépend de rien de spécial, et c'est la façon dont vous devriez le faire. Si vous avez besoin de quelque chose qui supprime également les sous-répertoires et leur contenu, utilisez la récursivité:
void purgeDirectory(File dir) {
for (File file: dir.listFiles()) {
if (file.isDirectory())
purgeDirectory(file);
file.delete();
}
}
Pour épargner les sous-répertoires et leur contenu (partie de votre question), modifiez comme suit:
void purgeDirectoryButKeepSubDirectories(File dir) {
for (File file: dir.listFiles()) {
if (!file.isDirectory())
file.delete();
}
}
Ou, puisque vous vouliez une solution sur une ligne:
for (File file: dir.listFiles())
if (!file.isDirectory())
file.delete();
L'utilisation d'une bibliothèque externe pour une tâche aussi triviale n'est pas une bonne idée, sauf si vous avez besoin de cette bibliothèque pour autre chose de toute façon, auquel cas il est préférable d'utiliser le code existant. De toute façon, vous semblez utiliser la bibliothèque Apache, utilisez donc sa méthode FileUtils.cleanDirectory()
.
Ceci ne supprime que les fichiers de ABC (les sous-répertoires ne sont pas modifiés):
Arrays.stream(new File("C:/test/ABC/").listFiles()).forEach(File::delete);
Ceci ne supprime que les fichiers de ABC (et sous-répertoires):
Files.walk(Paths.get("C:/test/ABC/"))
.filter(Files::isRegularFile)
.map(Path::toFile)
.forEach(File::delete);
^ Cette version nécessite la gestion de l'IOException
Ou utiliser ceci dans Java 8:
try {
Files.newDirectoryStream( directory ).forEach( file -> {
try { Files.delete( file ); }
catch ( IOException e ) { throw new UncheckedIOException(e); }
} );
}
catch ( IOException e ) {
e.printStackTrace();
}
Dommage que le traitement des exceptions soit si volumineux, sinon ce serait un one-liner ...
public class DeleteFile {
public static void main(String[] args) {
String path="D:\test";
File file = new File(path);
File[] files = file.listFiles();
for (File f:files)
{if (f.isFile() && f.exists)
{ f.delete();
system.out.println("successfully deleted");
}else{
system.out.println("cant delete a file due to open or error");
} } }}
Une autre solution Java 8 Diffusez en continu pour supprimer tout le contenu d'un dossier, sous-répertoires inclus, mais pas le dossier lui-même.
Usage:
Path folder = Paths.get("/tmp/folder");
CleanFolder.clean(folder);
et le code:
public interface CleanFolder {
static void clean(Path folder) throws IOException {
Function<Path, Stream<Path>> walk = p -> {
try { return Files.walk(p);
} catch (IOException e) {
return Stream.empty();
}};
Consumer<Path> delete = p -> {
try {
Files.delete(p);
} catch (IOException e) {
}
};
Files.list(folder)
.flatMap(walk)
.sorted(Comparator.reverseOrder())
.forEach(delete);
}
}
Le problème avec chaque solution de flux impliquant Files.walk ou Files.delete est que ces méthodes génèrent des exceptions IOException difficiles à gérer dans les flux.
J'ai essayé de créer une solution aussi concise que possible.
Pour supprimer tous les fichiers du répertoire, dites "C:\Example"
File file = new File("C:\\Example");
String[] myFiles;
if (file.isDirectory()) {
myFiles = file.list();
for (int i = 0; i < myFiles.length; i++) {
File myFile = new File(file, myFiles[i]);
myFile.delete();
}
}
package com;
import Java.io.File;
public class Delete {
public static void main(String[] args) {
String files;
File file = new File("D:\\del\\yc\\gh");
File[] listOfFiles = file.listFiles();
for (int i = 0; i < listOfFiles.length; i++)
{
if (listOfFiles[i].isFile())
{
files = listOfFiles[i].getName();
System.out.println(files);
if(!files.equalsIgnoreCase("Scan.pdf"))
{
boolean issuccess=new File(listOfFiles[i].toString()).delete();
System.err.println("Deletion Success "+issuccess);
}
}
}
}
}
Si vous voulez supprimer tous les fichiers, supprimez
if(!files.equalsIgnoreCase("Scan.pdf"))
déclaration cela fonctionnera.
Je pense que cela fonctionnera (basé sur la réponse précédente de NonlinearFruit):
Files.walk(Paths.get("C:/test/ABC/"))
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.filter(item -> !item.getPath().equals("C:/test/ABC/"))
.forEach(File::delete);
À votre santé!