如何使用Java删除包含文件的文件夹

我想用Java创build和删除一个目录,但是它不工作。

File index = new File("/home/Work/Indexer1"); if (!index.exists()) { index.mkdir(); } else { index.delete(); if (!index.exists()) { index.mkdir(); } } 

Java不能删除其中包含数据的文件夹。 删除文件夹之前,您必须删除所有文件。

使用类似于:

 String[]entries = index.list(); for(String s: entries){ File currentFile = new File(index.getPath(),s); currentFile.delete(); } 

那么你应该可以通过使用index.delete()来删除文件夹未经testing!

只是一个class轮。

 import org.apache.commons.io.FileUtils; FileUtils.deleteDirectory(new File(destination)); 

文档在这里

这是有效的,尽pipe跳过目录testing看起来效率不高,但不是:testing立刻发生在listFiles()

 void deleteDir(File file) { File[] contents = file.listFiles(); if (contents != null) { for (File f : contents) { deleteDir(f); } } file.delete(); } 

在JDK 7中,您可以使用Files.walkFileTree()Files.deleteIfExists()来删除文件树。

在JDK 6中,一个可能的方法是使用Apache Commons中的FileUtils.deleteQuietly ,它将删除文件,目录或包含文件和子目录的目录。

使用Apache Commons-IO,它遵循一行:

 import org.apache.commons.io.FileUtils; FileUtils.forceDelete(new File(destination)); 

这可能比FileUtils.deleteDirectory (稍微)更高性能。

我的基本recursion版本,使用旧版本的JDK:

 public static void deleteFile(File element) { if (element.isDirectory()) { for (File sub : element.listFiles()) { deleteFile(sub); } } element.delete(); } 

我最喜欢这个解决scheme。 它不使用第三方库,而是使用Java 7的NIO2 。

 /** * Deletes Folder with all of its content * * @param folder path to folder which should be deleted */ public static void deleteFolderAndItsContent(final Path folder) throws IOException { Files.walkFileTree(folder, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { if (exc != null) { throw exc; } Files.delete(dir); return FileVisitResult.CONTINUE; } }); } 

这是Java 7+的最佳解决scheme:

 public static void deleteDirectory(String directoryFilePath) throws IOException { Path directory = Paths.get(directoryFilePath); if (Files.exists(directory)) { Files.walkFileTree(directory, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path path, BasicFileAttributes basicFileAttributes) throws IOException { Files.delete(path); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path directory, IOException ioException) throws IOException { Files.delete(directory); return FileVisitResult.CONTINUE; } }); } } 

在这

 index.delete(); if (!index.exists()) { index.mkdir(); } 

你在打电话

  if (!index.exists()) { index.mkdir(); } 

 index.delete(); 

这意味着你删除File.delete()之后再次创build文件返回一个布尔值。所以如果你想检查然后做System.out.println(index.delete()); 如果你true那么这意味着文件被删除

 File index = new File("/home/Work/Indexer1");  if (!index.exists())    {       index.mkdir();    }  else{      System.out.println(index.delete());//If you get true then file is deleted      if (!index.exists())        {          index.mkdir();// here you are creating again after deleting the file        }    } 

从下面的评论 ,更新的答案是这样的

 File f=new File("full_path");//full path like c:/home/ri if(f.exists()) { f.delete(); } else { try { //f.createNewFile();//this will create a file f.mkdir();//this create a folder } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

directry不能简单地删除,如果它有文件,所以你可能需要先删除文件,然后再删除目录

 public class DeleteFileFolder { public DeleteFileFolder(String path) { File file = new File(path); if(file.exists()) { do{ delete(file); }while(file.exists()); }else { System.out.println("File or Folder not found : "+path); } } private void delete(File file) { if(file.isDirectory()) { String fileList[] = file.list(); if(fileList.length == 0) { System.out.println("Deleting Directory : "+file.getPath()); file.delete(); }else { int size = fileList.length; for(int i = 0 ; i < size ; i++) { String fileName = fileList[i]; System.out.println("File path : "+file.getPath()+" and name :"+fileName); String fullPath = file.getPath()+"/"+fileName; File fileOrFolder = new File(fullPath); System.out.println("Full Path :"+fileOrFolder.getPath()); delete(fileOrFolder); } } }else { System.out.println("Deleting file : "+file.getPath()); file.delete(); } } 

如果你有子文件夹,你会发现Cemron答案的麻烦。 所以你应该创build一个这样的方法:

 private void deleteTempFile(File tempFile) { try { if(tempFile.isDirectory()){ File[] entries = tempFile.listFiles(); for(File currentFile: entries){ deleteTempFile(currentFile); } tempFile.delete(); }else{ tempFile.delete(); } getLogger().info("DELETED Temporal File: " + tempFile.getPath()); } catch(Throwable t) { getLogger().error("Could not DELETE file: " + tempFile.getPath(), t); } } 

其中一些答案似乎不必要的长:

 if (directory.exists()) { for (File file : directory.listFiles()) { file.delete(); } directory.delete(); } 

也适用于子目录。

我更喜欢java 8上的这个解决scheme:

  Files.walk(pathToBeDeleted) .sorted(Comparator.reverseOrder()) .map(Path::toFile) .forEach(File::delete); 

从这个网站: http : //www.baeldung.com/java-delete-directory

从其他部分删除它

 File index = new File("/home/Work/Indexer1"); if (!index.exists()) { index.mkdir(); System.out.println("Dir Not present. Creating new one!"); } index.delete(); System.out.println("File deleted successfully"); 

你可以尝试如下

  File dir = new File("path"); if (dir.isDirectory()) { dir.delete(); } 

如果您的文件夹中有子文件夹,您可能需要recursion删除它们。

 private void deleteFileOrFolder(File file){ try { for (File f : file.listFiles()) { f.delete(); deleteFileOrFolder(f); } } catch (Exception e) { e.printStackTrace(System.err); } } 
  import org.apache.commons.io.FileUtils; List<String> directory = new ArrayList(); directory.add("test-output"); directory.add("Reports/executions"); directory.add("Reports/index.html"); directory.add("Reports/report.properties"); for(int count = 0 ; count < directory.size() ; count ++) { String destination = directory.get(count); deleteDirectory(destination); } public void deleteDirectory(String path) { File file = new File(path); if(file.isDirectory()){ System.out.println("Deleting Directory :" + path); try { FileUtils.deleteDirectory(new File(path)); //deletes the whole folder } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System.out.println("Deleting File :" + path); //it is a simple file. Proceed for deletion file.delete(); } } 

奇迹般有效 。 对于文件夹和文件。 萨拉姆:)

如果存在子目录,则可以进行recursion调用

 import java.io.File; class DeleteDir { public static void main(String args[]) { deleteDirectory(new File(args[0])); } static public boolean deleteDirectory(File path) { if( path.exists() ) { File[] files = path.listFiles(); for(int i=0; i<files.length; i++) { if(files[i].isDirectory()) { deleteDirectory(files[i]); } else { files[i].delete(); } } } return( path.delete() ); } } 

番石榴21+救援。 仅在没有指向要删除的目录的符号链接时使用。

 com.google.common.io.MoreFiles.deleteRecursively( file.toPath(), RecursiveDeleteOption.ALLOW_INSECURE ) ; 

(这个问题很好的被谷歌收录了,所以其他人都喜欢番石榴可能会很高兴find这个答案,即使这个答案在其他地方是多余的。)

你可以使用这个function

 public void delete() { File f = new File("E://implementation1/"); File[] files = f.listFiles(); for (File file : files) { file.delete(); } }