2013-02-23 4 views
1

j'ai posé une question sur la façon de supprimer tous les fichiers des dossiers dans un répertoire, mais garder les dossiers, cela peut être trouvé ici:suppression récursive provoque une erreur de débordement de pile

How to delete files of a directory but not the folders

L'une des solutions proposais était d'utiliser récursivité, pour y parvenir:

public void DeleteFiles() { 
    File file = 
     new File(
      "D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/"+ 
      "resources/pdf/"); 
    System.out.println("Called deleteFiles"); 
    if (file.isDirectory()) { 
     for (File f : file.listFiles()) { 
      DeleteFiles(); 
     } 
    } else { 
     file.delete(); 
    } 
} 

Cependant, je viens d'obtenir une console pleine de dELetefiles Appelés, jusqu'à ce que je l'erreur de débordement de pile, il ne semble pas passer par le répertoire pour trouver les fichiers et les supprimer , Comment puis-je y parvenir?

+2

Votre récursion est évidemment faux, vous devriez prendre un peu de papier et écrivez votre logique, qui pourrait vous aider à –

+0

Si vous regardez la réponse originale cette question qui a utilisé la récursion, il avait un argument http://stackoverflow.com/questions/15041971/how-to-delete-files-of-a-directory-but-not-the-folders-java#answer-15042022 –

Répondre

2
File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/"); 

Vous créez le même fichier encore et encore. Déclarez ce fichier en dehors de la fonction.

Votre récursivité est différente de la suggestion.

public void DeleteFiles(File file) { 
    System.out.println("Called deleteFiles"); 
    if (file.isDirectory()) { 
     for (File f : file.listFiles()) { 
      DeleteFiles(f); 
     } 
    } else { 
     file.delete(); 
    } 
} 
2
public void DeleteFiles() { 
    File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/"); 
    System.out.println("Called deleteFiles"); 
    DeleteFiles(file); 
} 

public void DeleteFiles(File file) { 
    if (file.isDirectory()) { 
     for (File f : file.listFiles()) { 
      DeleteFiles(f); 
     } 
    } else { 
     file.delete(); 
    } 
} 
4

Recursion demande des ennuis quand il y a des solutions beaucoup plus simples. Avec commons-io:

import java.io.File; 
import org.apache.commons.io.FileUtils; 
import static org.apache.commons.io.filefilter.TrueFileFilter.TRUE; 

File root = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/"); 
Iterator<File> files = FileUtils.iterateFiles(root, TRUE, TRUE); 
for (File file : files) { 
    file.delete(); 
} 

ou JDK 7:

import java.nio.file.*; 
import java.nio.file.attribute.BasicFileAttributes; 

Path root = Paths.get("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/"); 
Files.walkFileTree(root, new SimpleFileVisitor<Path>() { 
    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
      throws IOException { 
     file.delete(); 
     return FileVisitResult.CONTINUE; 
    } 
}) 
+0

récursion est dans de nombreux cas le moyen le plus simple de mise en œuvre. Votre approche nécessite d'inclure une bibliothèque externe et utilise également la recusrsion – Trinimon

+0

@Andre: 1) JDK7 n'est pas une bibliothèque externe. 2) Dans la grande majorité du développement Java, l'ajout d'une bibliothèque pour accomplir certaines tâches est la manière préférée de résoudre un problème précisément parce qu'elle supprime la complexité de votre code, comme ci-dessus. 3) Aucun de mes codes ci-dessus n'est récursif, ce qui est le point: mon code est plus simple car l'implémentation est fournie par une bibliothèque fiable, et je n'ai pas à me préoccuper de cette implémentation. –

+0

désolé, 1. _org.apache.commons_ est définitivement une bibliothèque externe (consultez l'API ORACLE JDK1.7 http://docs.oracle.com/javase/7/docs/api/), 2. n'est pas valide dans tous cas, par exemple si vous avez des ressources limitées (Android, J2ME), les problèmes de licence ou besoin de personnalisations 3. et encore: org.apache.commons.io.FileUtils _does_ utilisent la récursivité (voir iterateFiles/listFiles/innerListFiles à http: // grepcode .com/fichier/repo1.maven.org/maven2/commons-io/commons-io/1.4/org/apache/commun/io/FileUtils.java # FileUtils.% 3Cinit% 3E% 28% 29 – Trinimon

Questions connexes