如何删除Android上一个文件夹中的所有文件和文件夹

问题描述 投票:0回答:15

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

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

它将删除 false,其中

Files[j]
是文件夹。

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

java android file-io
15个回答
73
投票

另请检查此链接从 Android 的内部存储中删除文件夹?.

void deleteRecursive(File fileOrDirectory) {

    if (fileOrDirectory.isDirectory())
        for (File child : fileOrDirectory.listFiles())
            deleteRecursive(child);

    fileOrDirectory.delete();

}

44
投票

最简单的方法是使用 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'  

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

8
投票

如果 storageDir 是目录

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

5
投票

对于您的情况,这非常有效 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);
}

4
投票

您可以这样检查:

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

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

3
投票

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

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

根据文档:

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


1
投票

//删除文件夹及其内容

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


1
投票

rm -rf
FileUtils.deleteDirectory 或自己递归删除目录性能更高。

经过广泛的基准测试,我们发现使用

rm -rf

比使用

FileUtils.deleteDirectory
快数倍。

当然,如果您有一个小或简单的目录,那没关系,但在我们的例子中,我们有多个 GB 和深度嵌套的子目录,使用

FileUtils.deleteDirectory

需要 10 多分钟,而使用

rm -rf
只需 1 分钟.

这是我们的粗略 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; }

如果您正在处理大型或复杂的目录,值得尝试。


1
投票

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

然后你就可以做

file.deleteDirectoryFiles()



0
投票

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



0
投票

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



0
投票
此方法将删除文件夹内的所有项目:

String directoryPath = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) + File.separator + context.getString(R.string.pdf_folder) + "/"; File file = new File("your dir"); //directoryPath String[] files; files = file.list(); for (int i=0; i<files.length; i++) { File myFile = new File(file, files[i]); myFile.delete(); }



0
投票

public static void deleteFolders(File folder){ File[] subfiles; if(folder.isFile()){folder.delete();} else if(folder.isDirectory()){ if(folder.listFiles().length>=1){ try{ subfiles=folder.listFiles(); for(int f = 0;f<subfiles.length;f++){ if(subfiles[f].isFile()){ deleteFolders(subfiles[f]); } if(subfiles[f].isDirectory()){ if(subfiles[f].listFiles().length>=1){ deleteFolders(subfiles[f]); }else deletes(subfiles[f]); } } } finally { folder.delete(); deleteFolders(folder); } } } } public static void deletes(File file) { if (file.exists()) { if (file.isDirectory() && file.listFiles().length == 0) { file.delete(); }else if (file.isFile()) { file.delete(); } else { if(file.isDirectory()&&file.listFiles().length>=1){ File[] files = file.listFiles(); if (files.length >= 1) { int i; for (i = 0;i < files.length;i++) { files[i].delete(); } file.delete(); } } } }

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.