【问题标题】:deleting folder from java [duplicate]从java中删除文件夹[重复]
【发布时间】:2011-04-16 02:20:47
【问题描述】:

在 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());
        }

    }

}

此代码不起作用,最好的方法是什么?

【问题讨论】:

    标签: java file directory


    【解决方案1】:

    我有这样的事情:

    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】:

    试试这个:

    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(); 
    } 
    

    【讨论】:

    • 乱码。试着清理一下。
    • 稍微改进了一下。
    • 我认为这行不通。 for 循环内的 return 语句将阻止您在删除第一个子项后递归到所有子项。
    【解决方案3】:

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

    但我建议您为此使用 Commons IO 之类的库。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        File.delete() 的 javadoc

        公共布尔删除()

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

        所以一个文件夹必须是空的,否则删除它会失败。您的代码当前首先使用最顶层的文件夹填充文件夹列表,然后是其子文件夹。由于您以相同的方式遍历列表,因此它会在删除其子文件夹之前尝试删除最顶层的文件夹,这将失败。

        更改这些行

            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();
            }
        

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

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

        【讨论】:

          【解决方案6】:

          我曾经为此写过一个方法。删除指定目录,目录删除成功返回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】:

            如果您使用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;
                }
              });
            };
            

            【讨论】:

            • 什么是继续和终止?我应该从某个地方导入它们吗?
            • @bikashg 枚举常量在 java.nio.file.FileVisitResult 中。大多数 IDE 应该足够聪明,可以建议导入枚举类型。
            • 对于那些IDE不够聪明的人(比如我的),手动在文件开头添加这个导入声明:import static java.nio.file.FileVisitResult.*;
            • 所以您只是划掉了单行解决方案,转而支持 25 行解决方案?哇..
            • @Vistritium 您仍然可以免费使用 FileUtils 版本。只是它相当不安全,因为它做出了一些可能正确也可能不正确的假设。文件系统很复杂
            【解决方案8】:

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

            检查this问题

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

                递归删除文件夹

                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);
                        }
                    }
                }
                

                【讨论】:

                  【解决方案11】:

                  我发现这段代码更容易理解和工作:

                  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.
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-04-28
                    • 1970-01-01
                    • 2021-07-28
                    • 2014-12-28
                    • 2017-02-16
                    • 2021-10-26
                    • 2012-07-14
                    • 1970-01-01
                    相关资源
                    最近更新 更多