Java 目录是';不要被删除

Java 目录是';不要被删除,java,file,directory,Java,File,Directory,我想做的是,当我的项目完成时,它创建的文件将被删除(以便删除其中的所有文件)。我所做的是 public void delete() { File f = new File (JavCapture.tmpLocation + "/tmp"); if (f.isDirectory()) { f.delete(); System.out.println("Deleted tmp folder!"); } } 这不仅不会删除文件夹,也不会执行pr

我想做的是,当我的项目完成时,它创建的文件将被删除(以便删除其中的所有文件)。我所做的是

public void delete() {
    File f = new File (JavCapture.tmpLocation + "/tmp");
    if (f.isDirectory()) {
        f.delete();
        System.out.println("Deleted tmp folder!");
    }
}
这不仅不会删除文件夹,也不会执行print语句,这意味着(我假设它的意思是)目录不存在,但它确实存在

我也用这个来定位

new File(tmpLocation + "/tmp").mkdir();

使用此方法只能删除空文件夹。编写一个递归方法,首先递归删除所有文件,然后再删除父文件夹

 void delete(File file) {
   if (file.isFile) 
      file.delete();
   else {
      for (File sub: file.listFiles()) 
        delete(sub);
      file.delete();
   }
 }

您可以尝试以下方法:

    public static boolean delete(final File directory){
    assert directory != null && directory.exists();
    if(!directory.isDirectory())
        return directory.delete();
    for(final File f : directory.listFiles())
        delete(f);
    return directory.delete();
}

大多数情况下,删除目录的语义与删除文件的语义不同。通常,在删除该目录之前,需要递归到该目录并删除该目录中的所有内容

正如@Audrius所说,在删除目录之前,必须先删除目录中的所有文件和目录中的所有目录

print语句未执行,因为程序出错。
如果文件的“delete”实现正常,您应该会看到一条错误消息;您是否以某种方式抑制了错误?

问题是,如果目录包含某些内容,则无法删除该目录。所以你必须递归删除目录的内容

在java 7中:

public class DeleteDirVisitor extends SimpleFileVisitor<Path> {

private Path baseDir;

public DeleteDirVisitor() {
}

/**
 * If baseDir is specified all the subdirectory will be deleted but not basedir
 * 
 * @param baseDir
 */
public DeleteDirVisitor(Path baseDir) {
    this.baseDir = baseDir;
}

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

@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    Files.delete(file);
    return FileVisitResult.CONTINUE;
}

您可以在Java 8中的Apache Commons IO中使用FileUtils.deleteDirectory()方法。我使用以下代码删除文件夹及其下的所有内容:

    Path path = Paths.get("tmp");
    if (Files.exists(path)) {
        List<Path> allFiles = new ArrayList<Path>();
        Files.walk(path).forEach(pa -> allFiles.add(pa));
        Collections.reverse(allFiles);
        allFiles.forEach(pa -> {try {System.out.println("deleting " + pa);Files.delete(pa);} catch(IOException e){}});
    }
Path Path=Path.get(“tmp”);
if(Files.exists(path)){
List allFiles=new ArrayList();
Files.walk(path.forEach(pa->allFiles.add(pa));
集合。反向(所有文件);
allFiles.forEach(pa->{try{System.out.println(“删除”+pa);Files.delete(pa);}catch(IOException e){});
}

删除最后一行中的System.out以进行静默删除。

打印文件位置,它可能不是您所想的。要删除目录,您必须首先确保它为空,这意味着目录中没有文件。请尝试捕获异常(将创建目录链接到try catch块中的delete调用的代码括起来)和打印堆栈跟踪。这可能会为您提供有关出错原因的指针。是否有任何方法可以删除目录中的所有内容?因为我需要删除目录中的内容,但有多个文件。您可以使用Apache Commons中的FileUtils.deleteDirectory方法IORE方法不考虑可能存在以下情况的目录:在一个目录中。谢谢,现在已经修复了。只对一个方法使用整个依赖关系似乎有点极端,你不觉得吗?
    Path path = Paths.get("tmp");
    if (Files.exists(path)) {
        List<Path> allFiles = new ArrayList<Path>();
        Files.walk(path).forEach(pa -> allFiles.add(pa));
        Collections.reverse(allFiles);
        allFiles.forEach(pa -> {try {System.out.println("deleting " + pa);Files.delete(pa);} catch(IOException e){}});
    }