Java NIO 2-删除文件夹进度-打开窗口资源管理器时出错

Java NIO 2-删除文件夹进度-打开窗口资源管理器时出错,java,Java,我编写了一个程序,使用JavaNIO2特性删除一个文件夹及其所有子文件夹和文件。如果没有打开窗口资源管理器,程序将平稳运行。但当窗口资源管理器打开时,它将引发一个错误(即删除文件夹为“e:\error”,而我停留在“e:”)。以下是测试文件夹的结构: "E:\Error\Error0\Error1\Error2\Error3\Error4\Error5\Error6\Error7\Error8\Error9" “Error2”文件夹中有两个文件:“Text.txt”和“Text2.txt” 这

我编写了一个程序,使用JavaNIO2特性删除一个文件夹及其所有子文件夹和文件。如果没有打开窗口资源管理器,程序将平稳运行。但当窗口资源管理器打开时,它将引发一个错误(即删除文件夹为“e:\error”,而我停留在“e:”)。以下是测试文件夹的结构:

"E:\Error\Error0\Error1\Error2\Error3\Error4\Error5\Error6\Error7\Error8\Error9"
“Error2”文件夹中有两个文件:“Text.txt”和“Text2.txt”

这是我的班级:

public class FileVisitorForTest extends SimpleFileVisitor<Path> {
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
    System.out.println(dir);
    Files.delete(dir);
    return FileVisitResult.CONTINUE;
}

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

public static void main(String[] args) throws IOException {
    Path targetFolder = Paths.get("E:\\Error");
    Files.walkFileTree(targetFolder, new FileVisitorForTest());
}
}
请帮助我了解这种情况。谢谢大家!

我的操作系统是64位的Windows7

更新:可以通过在postVisitDirectory()方法中添加如下线程来克服此错误:

public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
    Files.delete(dir);
    try {
        Thread.sleep(1);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return FileVisitResult.CONTINUE;
}

但我仍然不知道为什么。

当文件夹仍在资源管理器窗口中打开时,无法将其删除。它是Windows的东西,而不是Java的东西。

当文件夹仍在资源管理器窗口中打开时,无法删除它。这是Windows的东西,不是Java的东西。

您可以检查文件是否被其他进程锁定

File File=新文件(“some_File.txt”);
System.out.println(file.canWrite())

您可以检查该文件是否被其他进程锁定

File File=新文件(“some_File.txt”);
System.out.println(file.canWrite())

感谢您的快速评论,但在本例中,我没有打开包含删除文件夹的驱动器。文件夹位于驱动器E:但我打开了驱动器C:上的Windows文件管理器。谢谢您的快速评论,但在本例中,我没有打开包含删除文件夹的驱动器。文件夹在驱动器E中:但我打开了驱动器C上的Windows文件资源管理器:。谢谢您的回答,但我确信该文件未被任何进程锁定,因为我没有打开删除文件夹中的任何内容。嘿,我运行了您的代码,仅当进程锁定任何文本文件(记事本)时才能重新创建您的案例。你能不能再检查一下,在删除之前它们是否没有被使用(尝试重命名它们或其他)我通过更改txt文件的文件名再次检查过,但是这个错误仍然存在(如果我没有在postVisitDirectory()方法中使用Thread.sleep())。好的,既然线程睡眠解决了这个问题,我想这与Windows文件系统的性能有关(默认情况下速度较慢)。因此,当您调用“Files.delete(path)”时,操作系统需要一些时间来删除目录,并且只会删除其中包含文件的目录,这会使过程更加缓慢。因此,我建议您之前的删除操作是锁定文件。你能告诉我你的硬盘规格吗幸运的是,你上面提到的方法没有帮助。无论如何,我认为这不是一个好的解决方案,因为我希望我的程序在没有任何操作系统配置的情况下运行良好。我会找到另一种方法,谢谢你。谢谢你的回答,但我确信文件没有被任何进程锁定,因为我没有打开删除文件夹中的任何内容。嘿,我运行了你的代码,只有当进程锁定任何文本文件(记事本)时,我才能重新创建你的案例。你能不能再检查一下,在删除之前它们是否没有被使用(尝试重命名它们或其他)我通过更改txt文件的文件名再次检查过,但是这个错误仍然存在(如果我没有在postVisitDirectory()方法中使用Thread.sleep())。好的,既然线程睡眠解决了这个问题,我想这与Windows文件系统的性能有关(默认情况下速度较慢)。因此,当您调用“Files.delete(path)”时,操作系统需要一些时间来删除目录,并且只会删除其中包含文件的目录,这会使过程更加缓慢。因此,我建议您之前的删除操作是锁定文件。你能告诉我你的硬盘规格吗幸运的是,你上面提到的方法没有帮助。无论如何,我认为这不是一个好的解决方案,因为我希望我的程序在没有任何操作系统配置的情况下运行良好。我会找到另一条路的,谢谢。
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
    Files.delete(dir);
    try {
        Thread.sleep(1);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return FileVisitResult.CONTINUE;
}