【问题标题】:How to delete all files and folders in one folder on Android如何在Android上删除一个文件夹中的所有文件和文件夹
【发布时间】:2013-02-02 13:33:59
【问题描述】:

我使用此代码删除所有文件:

File root = new File("root path");
File[] Files = root.listFiles();
if(Files != null) {
    int j;
    for(j = 0; j < Files.length; j++) {
        System.out.println(Files[j].getAbsolutePath());
        System.out.println(Files[j].delete());
    }
}

如果Files[j]是一个文件夹,它将删除false。

我想删除文件夹及其所有子文件。
我该如何修改这个?

【问题讨论】:

标签: java android file-io


【解决方案1】:

最简单的方法是使用 Apache Commons IO 库中的 FileUtils.deleteDirectory

File dir = new File("root path");
FileUtils.deleteDirectory(dir);

请记住,这也会删除包含目录。

在 gradle 文件中添加这一行以获得 Apache

compile 'org.apache.commons:commons-io:1.3.2'  

【讨论】:

  • 编译 'org.apache.commons:commons-io:1.3.2' //用于 gradle 导入
【解决方案2】:

你可以这样检查:

for(j = 0; j < Files.length; j++) {

    if(file.isDirectory()){
        for(File f : file.listFiles()){
        System.out.println(Files[j].getAbsolutePath());
        System.out.println(Files[j].delete());
    }
    else {
        System.out.println(Files[j].getAbsolutePath());
        System.out.println(Files[j].delete());
    }
}

【讨论】:

    【解决方案3】:

    也请查看此链接Delete folder from internal storage in android?

    void deleteRecursive(File fileOrDirectory) {
    
        if (fileOrDirectory.isDirectory())
            for (File child : fileOrDirectory.listFiles())
                deleteRecursive(child);
    
        fileOrDirectory.delete();
    
    }
    

    【讨论】:

    • 直截了当
    • fileOrDirectory.listFiles() 可能会在读取文件时出现 I/O 错误返回 null。这在文档中有所说明:developer.android.com/reference/java/io/File.html#listFiles()
    【解决方案4】:

    你可以试试这个代码来删除文件和子文件

    public void deleteFile(File f){
    String[] flist=f.list();
    for(int i=0;i<flist.length;i++){
        System.out.println(" "+f.getAbsolutePath());
        File temp=new File(f.getAbsolutePath()+"/"+flist[i]);
        if(temp.isDirectory()){
           deleteFile(temp) ;
           temp.delete();
        }else{
        temp.delete();
        }
    

    【讨论】:

      【解决方案5】:
      File file = new File("C:\\A\\B");        
          String[] myFiles;      
      
           myFiles = file.list();  
           for (int i=0; i<myFiles.length; i++) {  
               File myFile = new File(file, myFiles[i]);   
               myFile.delete();  
           }  
      B.delete();// deleting directory.
      

      你可以这样写方法:删除dir下的所有文件和子目录。如果所有删除都成功,则返回true。如果删除失败,该方法停止尝试删除并返回false。

      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;
                  }
              }
          }
      
          // The directory is now empty so delete it
          return dir.delete();
      }
      

      【讨论】:

        【解决方案6】:

        对于您的情况,这非常有效 http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html#cleanDirectory(java.io.File)

        File dir = new File("dir_path");
        if(dir.exists() && dir.isDirectory()) {
            FileUtils.cleanDirectory(dir);
        }
        

        如果您想删除文件夹本身。 (它不必为空)。也可以用于文件。

        http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html#forceDelete(java.io.File)

        File dir = new File("dir_path");
        if(dir.exists()) {
            FileUtils.forceDelete(dir);
        }
        

        【讨论】:

        • 您最好在答案中格式化代码 sn-p,而不是简单地链接链接。另外,请尝试准确解释您提供的答案。
        • 不要忘记将 commons io jar 添加到您的项目中。 [apache commons jar 链接在这里] (commons.apache.org/proper/commons-io/download_io.cgi)
        【解决方案7】:

        此代码对我有用。 “imagesFolder”有一些文件和文件夹,而这些文件夹又包含文件。

          if (imagesFolder.isDirectory())
          {
               String[] children = imagesFolder.list(); //Children=files+folders
               for (int i = 0; i < children.length; i++)
               {
                 File file=new File(imagesFolder, children[i]);
                 if(file.isDirectory())
                 {
                  String[] grandChildren = file.list(); //grandChildren=files in a folder
                  for (int j = 0; j < grandChildren.length; j++)
                  new File(file, grandChildren[j]).delete();
                  file.delete();                        //Delete the folder as well
                 }
                 else
                 file.delete();
              }
          }
        

        【讨论】:

          【解决方案8】:

          如果 storageDir 是目录

          for(File tempFile : storageDir.listFiles()) {
              tempFile.delete();
          }
          

          【讨论】:

          • 如果目录中有非空目录需要删除,则此方法无效。
          【解决方案9】:

          #1

          File mFile = new File(Environment.getExternalStorageDirectory() + "/folder");
          try {
              deleteFolder(mFile);
          } catch (IOException e) {
              Toast.makeText(getContext(), "Unable to delete folder", Toast.LENGTH_SHORT).show();
          }
          
          public void deleteFolder(File folder) throws IOException {
              if (folder.isDirectory()) {
                 for (File ct : folder.listFiles()){
                      deleteFolder(ct);
                 }
              }
              if (!folder.delete()) {
                 throw new FileNotFoundException("Unable to delete: " + folder);
              }
          }
          

          #2(根)

          try {
              Process p = Runtime.getRuntime().exec("su");
              DataOutputStream outputStream = new DataOutputStream(p.getOutputStream());
              outputStream.writeBytes("rm -Rf /system/file.txt\n");
              outputStream.flush();
              p.waitFor();
              } catch (IOException | InterruptedException e) {
                 Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
              }
          

          【讨论】:

            【解决方案10】:

            // 删除文件夹及其内容

            public static void DeleteFolder(File folder)
            {
                try
                {
                    FileUtils.deleteDirectory(folder);
                } catch (Exception ex)
                {
                    Log.e(" Failed delete folder: ", ex.getMessage());
                }
            }
            

            // 只删除文件夹内容

            public static void DeleteFolderContents(File folder)
            {
                try
                {
                    FileUtils.cleanDirectory(folder);
                } catch (Exception ex)
                {
                    Log.e(" Failed delete folder contents: ", ex.getMessage());
                }
            }
            

            文档:org.apache.commons.io.FileUtils.cleanDirectory

            【讨论】:

              【解决方案11】:

              rm -rfFileUtils.deleteDirectory 或递归删除目录的性能很多

              经过广泛的基准测试,我们发现使用rm -rf 比使用FileUtils.deleteDirectory 快​​几倍。

              当然,如果您有一个小目录或简单目录,那没关系,但在我们的例子中,我们有多个千兆字节和深度嵌套的子目录,FileUtils.deleteDirectory 需要 10 多分钟,@ 只需 1 分钟987654326@.

              这是我们的粗略 Java 实现:

              // Delete directory given and all subdirectories and files (i.e. recursively).
              //
              static public boolean deleteDirectory( File file ) throws IOException, InterruptedException {
              
                  if ( file.exists() ) {
              
                      String deleteCommand = "rm -rf " + file.getAbsolutePath();
                      Runtime runtime = Runtime.getRuntime();
              
                      Process process = runtime.exec( deleteCommand );
                      process.waitFor();
              
                      return true;
                  }
              
                  return false;
              
              }
              

              如果您要处理大型或复杂的目录,值得一试。

              【讨论】:

                【解决方案12】:

                作为一个 kotlin 扩展函数,你可以这样做

                fun File.deleteDirectoryFiles(){
                    this.listFiles().forEach {
                        if(it.isDirectory){
                            it.deleteDirectoryFiles()
                        }else{
                            it.delete()
                        }
                    }
                
                    this.delete()
                }
                

                那你就可以了

                file.deleteDirectoryFiles()
                

                【讨论】:

                  【解决方案13】:

                  从 Kotlin 1.5.31 开始,有一个 Kotlin 扩展方法,其工作原理如下:

                  val resultsOfDeleteOperation = File("<Full path to folder>").deleteRecursively()
                  

                  根据文档:

                  删除此文件及其所有子文件。请注意,如果此操作失败,则可能已发生部分删除。 回报: 如果文件或目录被成功删除,则为 true,否则为 false。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-01-14
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-05-19
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多