用Java递归删除目录


382

有没有办法用Java递归删除整个目录?

在正常情况下,可以删除一个空目录。但是,要删除带有目录的整个目录,就不再那么简单了。

如何用Java删除包含目录的整个目录?


4
使用非空目录调用File.delete()时,应仅返回false。
S

如果您使用的是Java 8,请参见@RoK的答案。
罗宾(Robin)

Answers:


462

您应该查看Apache的commons-io。它具有一个FileUtils类,可以完成您想要的操作。

FileUtils.deleteDirectory(new File("directory"));

3
此功能可能包装了Erickson在其答案中提供的代码。
paweloque

14
更加彻底。它可以在Linux / Unix上正确处理诸如符号链接之类的事情。 svn.apache.org/viewvc/commons/proper/io/trunk/src/java/org/...
史蒂夫ķ



当Java开箱即用时,为什么还要添加另一个依赖关系?参见RoK在此页面上的回答,或 stackoverflow.com/questions/35988192/…–
foo

190

使用Java 7,我们最终可以通过可靠的符号链接检测做到这一点。(我目前不认为Apache的commons-io具有可靠的符号链接检测功能,因为它无法处理使用创建的Windows上的链接mklink。)

出于历史原因,这是Java 7之前的版本,它遵循符号链接。

void delete(File f) throws IOException {
  if (f.isDirectory()) {
    for (File c : f.listFiles())
      delete(c);
  }
  if (!f.delete())
    throw new FileNotFoundException("Failed to delete file: " + f);
}

11
File.delete()没有该功能。
S

14
@Erickson:FileNotFoundException是否不是删除失败的可怜异常?如果该文件确实不再存在,则必须已将其删除,这意味着从语义上讲删除不会失败-它无关紧要。如果由于其他原因导致失败,则不是因为找不到该文件。
劳伦斯·多尔

46
非常小心。这将取消引用符号链接。如果您在例如linux上,并且有一个foo带有链接的文件夹,foo/link使得link->/调用delete(new File(foo)) 将删除您的用户允许的文件系统!
Miquel

4
@Miquel没有意义-我们为什么要小心?提供的代码肯定是要删除整个目录,这似乎是要执行的操作。我不明白这里有什么危险。
Joehot200 '16

12
@ Joehot200您是正确的,在目录符号链接上调用delete不会删除目录,而只是符号链接本身。删除目录实际上需要使用ReadSymbolicLink明确遵循符号链接。我的错!发现得很好
Miquel

148

在Java 7+中,您可以使用Filesclass。代码很简单:

Path directory = Paths.get("/tmp");
Files.walkFileTree(directory, 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 {
       Files.delete(dir);
       return FileVisitResult.CONTINUE;
   }
});

2
这个解决方案看起来非常优雅,根本不包含目录遍历逻辑!
Zero3

1
“要找到一颗珍珠跳入大海深处。” 到目前为止,这是我找到的最干净的解决方案。不得不深入研究。辉煌!
罗勒·穆萨

20
“代码不是”简单删除一个目录不是“很简单” :-)但是,我认为这是纯Java的最佳解决方案。

1
请注意,此处使用的walkFileTree重载“ 不遵循符号链接 ”。(Javadoc:docs.oracle.com/javase/7/docs/api/java/nio/file/…
Stephan

1
如果步行无法列出目录,则可能应该调用super.postVisitDirectory(dir, exc);您的postVisitDirectory方法以使其崩溃。
Tom Anderson

68

一线解决方案(Java8),以递归方式删除所有文件和目录,包括起始目录:

Files.walk(Paths.get("c:/dir_to_delete/"))
                .map(Path::toFile)
                .sorted((o1, o2) -> -o1.compareTo(o2))
                .forEach(File::delete);

我们使用反向顺序的比较器,否则File :: delete将无法删除可能为非空的目录。因此,如果要保留目录并仅删除文件,只需在sorted()中删除比较器,或者完全删除排序并添加文件过滤器:

Files.walk(Paths.get("c:/dir_to_delete/"))
                .filter(Files::isRegularFile)
                .map(Path::toFile)
                .forEach(File::delete);

1
您需要将第一个排序更改为.sorted(Comparator :: reverseOrder)以删除所有目录。否则,父目录将在子目录之前排序,因此不会删除,因为它不为空。对于使用Java 8的人来说,这是一个很好的答案!
罗宾(Robin)

1
正确的方法是.sorted(Comparator.reverseOrder())将建议Comparator::reverseOrder没有工作。参见:stackoverflow.com/questions/43036611/…–
user1156544

4
Robin,请注意“ -o1.compareTo(o2)”中的减号。它与.sorted(Comparator.reverseOrder)相同
RoK

是Files.walk顺序的吗?还是此答案需要forEachOrdered而不是forEach以避免尝试删除非空目录?
Silwing

只需使用:.sorted((f1, f2) -> f2.compareTo(f1)),比较f2f1代替f1f2
Beto Neto

67

Java 7添加了对具有符号链接处理的步行目录的支持:

import java.nio.file.*;

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

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException
        {
            // try to delete the file anyway, even if its attributes
            // could not be read, since delete-only access is
            // theoretically possible
            Files.delete(file);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException
        {
            if (exc == null)
            {
                Files.delete(dir);
                return FileVisitResult.CONTINUE;
            }
            else
            {
                // directory iteration failed; propagate exception
                throw exc;
            }
        }
    });
}

我将其用作特定于平台的方法的备用(在此未经测试的代码中):

public static void removeDirectory(Path directory) throws IOException
{
    // does nothing if non-existent
    if (Files.exists(directory))
    {
        try
        {
            // prefer OS-dependent directory removal tool
            if (SystemUtils.IS_OS_WINDOWS)
                Processes.execute("%ComSpec%", "/C", "RD /S /Q \"" + directory + '"');
            else if (SystemUtils.IS_OS_UNIX)
                Processes.execute("/bin/rm", "-rf", directory.toString());
        }
        catch (ProcessExecutionException | InterruptedException e)
        {
            // fallback to internal implementation on error
        }

        if (Files.exists(directory))
            removeRecursive(directory);
    }
}

(SystemUtils来自Apache Commons Lang。进程是私有的,但其行为应显而易见。)


我确实发现了Files.walkFileTree的一个问题-这不足以实现递归删除的版本,在该版本中,您会不断删除文件,直到用尽所有选项为止。快速故障版本就足够了,但是快速故障并不总是您想要的(例如,如果要清理临时文件,
则要

我不明白为什么这是真的。您可以根据需要处理错误-无需快速失败。我可以预见的唯一问题是,它可能无法处理在当前目录遍历期间创建的新文件,但这是一种更适合自定义解决方案的独特情况。
Trevor Robinson

1
如果您抑制了visitFile的错误并在失败的单个文件上调用walkFileTree,则不会出现任何错误(因此visitFile 必须传播发生的任何错误。)如果您要删除目录却无法删除一个文件,则唯一的回调称为是postVisitDirectory。即,如果访问一个文件时出错,则它不会访问目录中的其他文件。这就是我的意思。我确定可能有某种方法可以解决此问题,但是到现在为止,我们已经编写了比传统的递归删除例程更多的代码,因此我们决定不使用它。
2013年

感谢您的第一个代码,它对我很有用,但是我不得不更改它,因为它没有完成简单的deltree:我必须忽略“ postVisitDirectory”中的异常并返回CONTINUE,因为以下简单树无法完全完成删除:一个目录,其中有另一个目录,其中一个文件。在Windows上,所有这些都变得简单/正常。
Dreamspace总裁

这一切都从我得到的java.nio.file.DirectoryNotEmptyException开始。我发现了使用visitFileFailed的情况。如果您的目录结构在Windows中具有联结类型链接。这可能会导致2个问题:*)Files.walkFileTree跟随链接进入结并删除其中的所有内容。*)如果联结目标目录已被删除,则Files.walkFileTree解析链接失败,并显示NoSuchFileException,该异常在visitFileFailed中捕获。
安德烈斯·卢克

34

刚刚看到我的解决方案与erickson的解决方案大致相同,只是打包为静态方法。将其放到某个地方,比安装所有Apache Commons轻巧得多(如您所见),它的重量要轻得多。

public class FileUtils {
    /**
     * By default File#delete fails for non-empty directories, it works like "rm". 
     * We need something a little more brutual - this does the equivalent of "rm -r"
     * @param path Root File Path
     * @return true iff the file and all sub files/directories have been removed
     * @throws FileNotFoundException
     */
    public static boolean deleteRecursive(File path) throws FileNotFoundException{
        if (!path.exists()) throw new FileNotFoundException(path.getAbsolutePath());
        boolean ret = true;
        if (path.isDirectory()){
            for (File f : path.listFiles()){
                ret = ret && deleteRecursive(f);
            }
        }
        return ret && path.delete();
    }
}

20

具有堆栈且没有递归方法的解决方案:

File dir = new File("/path/to/dir");
File[] currList;
Stack<File> stack = new Stack<File>();
stack.push(dir);
while (! stack.isEmpty()) {
    if (stack.lastElement().isDirectory()) {
        currList = stack.lastElement().listFiles();
        if (currList.length > 0) {
            for (File curr: currList) {
                stack.push(curr);
            }
        } else {
            stack.pop().delete();
        }
    } else {
        stack.pop().delete();
    }
}

2
+1用于使用堆栈。这将适用于包含深层嵌套子目录的目录,而其他基于堆栈的方法将失败。
内森·奥斯曼

4
看到您通常没有嵌套数百个方法调用的问题,我认为您可能会更早遇到文件系统限制。
孟买2013年

2
注意list*上课的方法java.io.File。从Javadocs:“如果此抽象路径名不表示目录,或者发生I / O错误,则返回null。” 因此:if (currList.length > 0) {成为if (null != currList && currList.length > 0) {
kevinarpe

1
我使用ArrayDeque而不是Stack,它快一些。(不同步)
Wytze 2015年


15

番石榴一直Files.deleteRecursively(File)支持到番石榴9

番石榴10出发:

不推荐使用。此方法遭受不良的符号链接检测和竞争条件。仅通过外壳输入诸如rm -rf或的操作系统命令,才能适当地支持此功能del /s该方法计划在Guava 11.0版中从Guava中删除。

因此,番石榴11中没有这种方法。


6
太糟糕了。炮击似乎有些粗糙且不能携带。如果Apache Commons版本正常运行,那么大概就不可能实现。
安德鲁·麦金莱

6
@andrew Apache Commons实现应该与导致Guava删除其实现的问题类似,请参见code.google.com/p/guava-libraries/issues/detail?id=365
orip 2012年

apache commons版本检测符号链接,并且仅不遍历文件的子级。
阿贾克斯

5

12
for(Path p : Files.walk(directoryToDelete).
        sorted((a, b) -> b.compareTo(a)). // reverse; files before dirs
        toArray(Path[]::new))
{
    Files.delete(p);
}

或者,如果您想处理IOException

Files.walk(directoryToDelete).
    sorted((a, b) -> b.compareTo(a)). // reverse; files before dirs
    forEach(p -> {
        try { Files.delete(p); }
        catch(IOException e) { /* ... */ }
      });

2
这帮助我提出了Scala版本:Files.walk(path).iterator().toSeq.reverse.foreach(Files.delete)
James Ward

排序真的有必要吗?该walk方法已经保证了深度优先遍历。
VGR

比较器可以从中回收,Collections.reverseOrder()因此您的代码将 for (Path p : Files.walk(directoryToDelete).sorted(reverseOrder()).toArray(Path[]::new))假定它已静态导入。
namero999

@ namero999你的意思是Comparator.reverseOrderFiles.walk(dir) .sorted(Comparator.reverseOrder()) .toArray(Path[]::new))
杰夫(Jeff)

@杰夫很确定你是对的,主要是因为那里的记忆:)
namero999 '17

11
public void deleteRecursive(File path){
    File[] c = path.listFiles();
    System.out.println("Cleaning out folder:" + path.toString());
    for (File file : c){
        if (file.isDirectory()){
            System.out.println("Deleting file:" + file.toString());
            deleteRecursive(file);
            file.delete();
        } else {
            file.delete();
        }
    }
    path.delete();
}

5
具有布尔返回值且无重复的增强版本:pastebin.com/PqJyzQUx
Erik Kaplun 2014年

9
static public void deleteDirectory(File path) 
{
    if (path == null)
        return;
    if (path.exists())
    {
        for(File f : path.listFiles())
        {
            if(f.isDirectory()) 
            {
                deleteDirectory(f);
                f.delete();
            }
            else
            {
                f.delete();
            }
        }
        path.delete();
    }
}

漂亮的代码,但是有一个错误,一旦修复,它就可以工作。线f.delete()deleteDirectory(f)会引发NoSuchFileException因为deleteDirectory(f)已经删除该文件。每个目录在传入deleteDirectory(f)并被删除时都将成为路径path.delete()。因此,我们不需要f.delete()在本if f.isDerectory节中。因此,只需f.delete();在deleteDirectory(f)下删除即可。
Trieu Nguyen

5

符号链接和上面的代码失败的两种方法...不知道解决方案。

方式1

运行此命令以创建测试:

echo test > testfile
mkdir dirtodelete
ln -s badlink dirtodelete/badlinktodelete

在这里,您可以看到测试文件和测试目录:

$ ls testfile dirtodelete
testfile

dirtodelete:
linktodelete

然后运行commons-io deleteDirectory()。崩溃提示找不到文件。不知道其他示例在这里做什么。Linux rm命令将只删除链接,目录中的rm -r也将删除。

Exception in thread "main" java.io.FileNotFoundException: File does not exist: /tmp/dirtodelete/linktodelete

方式#2

运行此命令以创建测试:

mkdir testdir
echo test > testdir/testfile
mkdir dirtodelete
ln -s ../testdir dirtodelete/dirlinktodelete

在这里,您可以看到测试文件和测试目录:

$ ls dirtodelete testdir
dirtodelete:
dirlinktodelete

testdir:
testfile

然后运行commons-io deleteDirectory()或其他人发布的示例代码。它不仅删除目录,还删除正在删除的目录之外的测试文件。(它隐式地取消引用目录,并删除内容)。rm -r仅删除链接。您需要使用类似以下的方法删除已取消引用的文件:“查找-Ldirodelete -t​​ype f -exec rm {} \;”。

$ ls dirtodelete testdir
ls: cannot access dirtodelete: No such file or directory
testdir:

4

您可以使用:

org.apache.commons.io.FileUtils.deleteQuietly(destFile);

删除文件,永不引发异常。如果file是目录,请删除它和所有子目录。File.delete()和此方法之间的区别是:要删除的目录不必为空。无法删除文件或目录时,不会引发任何异常。


4

一个最佳的解决方案,该方法以一致的方式处理异常,该方法应始终将方法抛出的异常描述为该方法正在尝试(但失败)的方法:

private void deleteRecursive(File f) throws Exception {
    try {
        if (f.isDirectory()) {
            for (File c : f.listFiles()) {
                deleteRecursive(c);
            }
        }
        if (!f.delete()) {
            throw new Exception("Delete command returned false for file: " + f);
        }
    } 
    catch (Exception e) {
        throw new Exception("Failed to delete the folder: " + f, e);
    }
}

3

在旧项目中,我需要创建本机Java代码。我创建类似于Paulitex代码的代码。看到:

public class FileHelper {

   public static boolean delete(File fileOrFolder) {
      boolean result = true;
      if(fileOrFolder.isDirectory()) {
         for (File file : fileOrFolder.listFiles()) {
            result = result && delete(file);
         }
      }
      result = result && fileOrFolder.delete();
      return result;
   } 
}

和单元测试:

public class FileHelperTest {

    @Before
    public void setup() throws IOException {
       new File("FOLDER_TO_DELETE/SUBFOLDER").mkdirs();
       new File("FOLDER_TO_DELETE/SUBFOLDER_TWO").mkdirs();
       new File("FOLDER_TO_DELETE/SUBFOLDER_TWO/TEST_FILE.txt").createNewFile();
    }

    @Test
    public void deleteFolderWithFiles() {
       File folderToDelete = new File("FOLDER_TO_DELETE");
       Assert.assertTrue(FileHelper.delete(folderToDelete));
       Assert.assertFalse(new File("FOLDER_TO_DELETE").exists());
    }

}

3

下面的代码递归删除给定文件夹中的所有内容。

boolean deleteDirectory(File directoryToBeDeleted) {
    File[] allContents = directoryToBeDeleted.listFiles();
    if (allContents != null) {
        for (File file : allContents) {
            deleteDirectory(file);
        }
    }
    return directoryToBeDeleted.delete();
}

2

这是一个接受命令行参数的基本方法,您可能需要附加自己的错误检查或将其调整为适合您的方式。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class DeleteFiles {

/**
 * @param intitial arguments take in a source to read from and a 
 * destination to read to
 */
    public static void main(String[] args)
                     throws FileNotFoundException,IOException {
        File src = new File(args[0]);
        if (!src.exists() ) {
            System.out.println("FAILURE!");
        }else{
            // Gathers files in directory
            File[] a = src.listFiles();
            for (int i = 0; i < a.length; i++) {
                //Sends files to recursive deletion method
                fileDelete(a[i]);
            }
            // Deletes original source folder
            src.delete();
            System.out.println("Success!");
        }
    }

    /**
     * @param srcFile Source file to examine
     * @throws FileNotFoundException if File not found
     * @throws IOException if File not found
     */
    private static void fileDelete(File srcFile)
                     throws FileNotFoundException, IOException {
        // Checks if file is a directory
        if (srcFile.isDirectory()) {
            //Gathers files in directory
            File[] b = srcFile.listFiles();
            for (int i = 0; i < b.length; i++) {
                //Recursively deletes all files and sub-directories
                fileDelete(b[i]);
            }
            // Deletes original sub-directory file
            srcFile.delete();
        } else {
            srcFile.delete();
        }
    }
}

希望对您有所帮助!


1

也许解决此问题的方法可能是使用埃里克森答案中的代码重新实现File类的delete方法:

public class MyFile extends File {

  ... <- copy constructor

  public boolean delete() {
    if (f.isDirectory()) {
      for (File c : f.listFiles()) {
        return new MyFile(c).delete();
      }
    } else {
        return f.delete();
    }
  }
}

1
我认为它的实现是为了模仿大多数命令外壳实用程序(例如“ rm”,“ rmdir”和“ del”)的行为。在这两种选择中,当前的实现方式肯定会最大程度地降低整体意外(和愤怒)的可能性。它不会改变。
erickson

4
通常,我看到的唯一Java JRE包来自Swing。通常,扩展其他类(例如java.io.File)不是一个好主意,因为它可能导致事情以意外的方式起作用。
Eddie

1

没有Commons IO和<Java SE 7

public static void deleteRecursive(File path){
            path.listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    if (pathname.isDirectory()) {
                        pathname.listFiles(this);
                        pathname.delete();
                    } else {
                        pathname.delete();
                    }
                    return false;
                }
            });
            path.delete();
        }

0

尽管可以使用file.delete()轻松删除文件,但目录必须为空才能删除。使用递归可以轻松做到这一点。例如:

public static void clearFolders(String[] args) {
        for(String st : args){
            File folder = new File(st);
            if (folder.isDirectory()) {
                File[] files = folder.listFiles();
                if(files!=null) { 
                    for(File f: files) {
                        if (f.isDirectory()){
                            clearFolders(new String[]{f.getAbsolutePath()});
                            f.delete();
                        } else {
                            f.delete();
                        }
                    }
                }
            }
        }
    }

0

我对这个例程进行了编码,该例程具有3个安全标准,可以更安全地使用。

package ch.ethz.idsc.queuey.util;

import java.io.File;
import java.io.IOException;

/** recursive file/directory deletion
 * 
 * safety from erroneous use is enhanced by three criteria
 * 1) checking the depth of the directory tree T to be deleted
 * against a permitted upper bound "max_depth"
 * 2) checking the number of files to be deleted #F
 * against a permitted upper bound "max_count"
 * 3) if deletion of a file or directory fails, the process aborts */
public final class FileDelete {
    /** Example: The command
     * FileDelete.of(new File("/user/name/myapp/recordings/log20171024"), 2, 1000);
     * deletes given directory with sub directories of depth of at most 2,
     * and max number of total files less than 1000. No files are deleted
     * if directory tree exceeds 2, or total of files exceed 1000.
     * 
     * abort criteria are described at top of class
     * 
     * @param file
     * @param max_depth
     * @param max_count
     * @return
     * @throws Exception if criteria are not met */
    public static FileDelete of(File file, int max_depth, int max_count) throws IOException {
        return new FileDelete(file, max_depth, max_count);
    }

    // ---
    private final File root;
    private final int max_depth;
    private int removed = 0;

    /** @param root file or a directory. If root is a file, the file will be deleted.
     *            If root is a directory, the directory tree will be deleted.
     * @param max_depth of directory visitor
     * @param max_count of files to delete
     * @throws IOException */
    private FileDelete(final File root, final int max_depth, final int max_count) throws IOException {
        this.root = root;
        this.max_depth = max_depth;
        // ---
        final int count = visitRecursively(root, 0, false);
        if (count <= max_count) // abort criteria 2)
            visitRecursively(root, 0, true);
        else
            throw new IOException("more files to be deleted than allowed (" + max_count + "<=" + count + ") in " + root);
    }

    private int visitRecursively(final File file, final int depth, final boolean delete) throws IOException {
        if (max_depth < depth) // enforce depth limit, abort criteria 1)
            throw new IOException("directory tree exceeds permitted depth");
        // ---
        int count = 0;
        if (file.isDirectory()) // if file is a directory, recur
            for (File entry : file.listFiles())
                count += visitRecursively(entry, depth + 1, delete);
        ++count; // count file as visited
        if (delete) {
            final boolean deleted = file.delete();
            if (!deleted) // abort criteria 3)
                throw new IOException("cannot delete " + file.getAbsolutePath());
            ++removed;
        }
        return count;
    }

    public int deletedCount() {
        return removed;
    }

    public void printNotification() {
        int count = deletedCount();
        if (0 < count)
            System.out.println("deleted " + count + " file(s) in " + root);
    }
}

0

好吧,让我们假设一个例子,

import java.io.File;
import java.io.IOException;

public class DeleteDirectory
{
   private static final String folder = "D:/project/java";

   public static void main(String[] args) throws IOException
   {
      File fl = new File(folder);
      if(!fl.exists()) // checking if directory exists
      {
         System.out.println("Sorry!! directory doesn't exist.");
      }
      else
      {
         DeleteDirectory dd = new DeleteDirectory();
         dd.deleteDirectory(fl);
      }
   }

   public void deleteDirectory(File file) throws IOException
   {
      if(file.isDirectory())
      {
         if(file.list().length == 0)
         { 
            deleteEmptyDirectory(file); // here if directory is empty delete we are deleting
         }
         else
         {
            File fe[] = file.listFiles();
            for(File deleteFile : fe)
            {
               deleteDirectory(deleteFile); // recursive call
            }
            if(file.list().length == 0)
            {
               deleteEmptyDirectory(file);
            }
         }
      }
      else
      {
         file.delete();
         System.out.println("File deleted : " + file.getAbsolutePath());
      }
   }

   private void deleteEmptyDirectory(File fi)
   {
      fi.delete();
      System.out.println("Directory deleted : " + fi.getAbsolutePath());
   }
}

有关更多信息,请参见以下资源

删除目录


0

rm -rf很多比更好的性能FileUtils.deleteDirectory

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

当然,如果您有一个小型目录或简单目录,都没关系,但是在我们的情况下,我们有多个GB和深嵌套的子目录,使用时将花费10分钟以上,FileUtils.deleteDirectory而使用则仅需要1分钟rm -rf

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

}

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


这可以跨平台工作吗?
OneCricketeer

@ cricket_007哪些平台?
约书亚品特

视窗?OpenWrt?BSD?
OneCricketeer

1
@ cricket_007绝对不是Windows。这已经过测试并在Android和macOS上使用。
约书亚品特

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.