从java删除文件夹

时间:2010-09-23 05:43:07

标签: java file directory

在Java中,我想删除包含文件和文件夹的文件夹中存在的所有内容。

public void startDeleting(String path) {
        List<String> filesList = new ArrayList<String>();
        List<String> folderList = new ArrayList<String>();
        fetchCompleteList(filesList, folderList, path);
        for(String filePath : filesList) {
            File tempFile = new File(filePath);
            tempFile.delete();
        }
        for(String filePath : folderList) {
            File tempFile = new File(filePath);
            tempFile.delete();
        }
    }

private void fetchCompleteList(List<String> filesList, 
    List<String> folderList, String path) {
    File file = new File(path);
    File[] listOfFile = file.listFiles();
    for(File tempFile : listOfFile) {
        if(tempFile.isDirectory()) {
            folderList.add(tempFile.getAbsolutePath());
            fetchCompleteList(filesList, 
                folderList, tempFile.getAbsolutePath());
        } else {
            filesList.add(tempFile.getAbsolutePath());
        }

    }

}

此代码不起作用,执行此操作的最佳方法是什么?

11 个答案:

答案 0 :(得分:135)

如果你使用Apache Commons IO,那就是单行:

FileUtils.deleteDirectory(dir);

请参阅FileUtils.deleteDirectory()


Guava用于支持类似的功能:

Files.deleteRecursively(dir);

几个版本以前已经从Guava中删除了它。


虽然上面的版本非常简单,但它也非常危险,因为它在没有告诉你的情况下做了很多假设。因此,尽管在大多数情况下它可能是安全的,但我更喜欢“官方方式”(从Java 7开始):

public static void deleteFileOrFolder(final Path path) throws IOException {
  Files.walkFileTree(path, new SimpleFileVisitor<Path>(){
    @Override public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs)
      throws IOException {
      Files.delete(file);
      return CONTINUE;
    }

    @Override public FileVisitResult visitFileFailed(final Path file, final IOException e) {
      return handleException(e);
    }

    private FileVisitResult handleException(final IOException e) {
      e.printStackTrace(); // replace with more robust error handling
      return TERMINATE;
    }

    @Override public FileVisitResult postVisitDirectory(final Path dir, final IOException e)
      throws IOException {
      if(e!=null)return handleException(e);
      Files.delete(dir);
      return CONTINUE;
    }
  });
};

答案 1 :(得分:84)

我有这样的事情:

public static boolean deleteDirectory(File directory) {
    if(directory.exists()){
        File[] files = directory.listFiles();
        if(null!=files){
            for(int i=0; i<files.length; i++) {
                if(files[i].isDirectory()) {
                    deleteDirectory(files[i]);
                }
                else {
                    files[i].delete();
                }
            }
        }
    }
    return(directory.delete());
}

答案 2 :(得分:7)

试试这个:

public static boolean deleteDir(File dir) 
{ 
  if (dir.isDirectory()) 
  { 
    String[] children = dir.list(); 
    for (int i=0; i<children.length; i++)
      return deleteDir(new File(dir, children[i])); 
  }  
  // The directory is now empty or this is a file so delete it 
  return dir.delete(); 
} 

答案 3 :(得分:6)

嵌套文件夹可能有问题。您的代码按照找到的顺序删除文件夹,这是自上而下的,但不起作用。如果您首先反转文件夹列表,它可能会有效。

但我建议你只使用像Commons IO这样的库。

答案 4 :(得分:6)

我发现这段代码更难以理解并且正在工作:

public static boolean deleteDir(File dir) {
    if (dir.isDirectory()) {
        String[] children = dir.list();
        for (int i = 0; i < children.length; i++) {
            boolean success = deleteDir(new File(dir, children[i]));
            if (!success) {
                return false;
            }
        }
    }

    return dir.delete(); // The directory is empty now and can be deleted.
}

答案 5 :(得分:3)

使用FileUtils.deleteDirectory()方法可以帮助简化删除目录及其下面的所有内容的过程。

检查this问题

答案 6 :(得分:2)

我曾经为此写过一个方法。它删除指定的目录,如果目录删除成功,则返回true。

/**
 * Delets a dir recursively deleting anything inside it.
 * @param dir The dir to delete
 * @return true if the dir was successfully deleted
 */
public static boolean deleteDirectory(File dir) {
    if(! dir.exists() || !dir.isDirectory())    {
        return false;
    }

    String[] files = dir.list();
    for(int i = 0, len = files.length; i < len; i++)    {
        File f = new File(dir, files[i]);
        if(f.isDirectory()) {
            deleteDirectory(f);
        }else   {
            f.delete();
        }
    }
    return dir.delete();
}

答案 7 :(得分:1)

您将所有(子)文件和文件夹递归地存储在列表中,但是使用当前代码存储父之前存储子文件的父文件夹。因此,您尝试在文件夹为空之前删除该文件夹。试试这段代码:

   if(tempFile.isDirectory()) {
        // children first
        fetchCompleteList(filesList, folderList, tempFile.getAbsolutePath());
        // parent folder last
        folderList.add(tempFile.getAbsolutePath());
   }

答案 8 :(得分:1)

File.delete()

的javadoc
  

public boolean delete()

     

删除此抽象路径名表示的文件或目录。如果此路径名&gt;表示目录,则该目录必须为空才能被删除。

因此文件夹必须为空或删除它将失败。您的代码目前首先填充文件夹列表中最顶层的文件夹,然后是其子文件夹。由于您以相同的方式浏览列表,因此在删除其子文件夹之前会尝试删除最顶层的文件夹,这将失败。

更改这些行

    for(String filePath : folderList) {
        File tempFile = new File(filePath);
        tempFile.delete();
    }

到这个

    for(int i = folderList.size()-1;i>=0;i--) {
        File tempFile = new File(folderList.get(i));
        tempFile.delete();
    }

应该使您的代码首先删除子文件夹。

删除操作在失败时也会返回false,因此您可以检查此值以在必要时进行一些错误处理。

答案 9 :(得分:1)

您应首先删除文件夹中的文件,然后删除文件夹。这样您将递归调用该方法。

答案 10 :(得分:-1)

它将以递归方式删除文件夹

public static void folderdel(String path){
    File f= new File(path);
    if(f.exists()){
        String[] list= f.list();
        if(list.length==0){
            if(f.delete()){
                System.out.println("folder deleted");
                return;
            }
        }
        else {
            for(int i=0; i<list.length ;i++){
                File f1= new File(path+"\\"+list[i]);
                if(f1.isFile()&& f1.exists()){
                    f1.delete();
                }
                if(f1.isDirectory()){
                    folderdel(""+f1);
                }
            }
            folderdel(path);
        }
    }
}