2016-01-20 87 views
0

我编写了一个程序,用于使用Java NIO 2功能删除包含所有子文件夹和文件的文件夹。在没有打开窗口浏览器的情况下,程序运行平稳。但是,当打开Window Explorer时(即删除文件夹是“E:\ Error”,并且我停留在“E:”),它会引发错误。下面是测试文件夹的结构:Java NIO 2 - 删除文件夹进度 - 如果窗口资源管理器正在打开,则发生错误

"E:\Error\Error0\Error1\Error2\Error3\Error4\Error5\Error6\Error7\Error8\Error9" 

有两个文件:“TEXT.TXT”和“Text2.txt”中的“误差2”文件夹中。

这是我的课:

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

错误显示在控制台当我与窗口文件浏览器在打开运行程序:

Exception in thread "main" java.nio.file.DirectoryNotEmptyException: E:\Error\Error0\Error1 
at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:265) 
at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103) 
at java.nio.file.Files.delete(Files.java:1077) 
at nio.FileVisitorForTest.postVisitDirectory(FileVisitorForTest.java:13) 
at nio.FileVisitorForTest.postVisitDirectory(FileVisitorForTest.java:10) 
at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:224) 
at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:199) 
at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:199) 
at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:69) 
at java.nio.file.Files.walkFileTree(Files.java:2600) 
at java.nio.file.Files.walkFileTree(Files.java:2633) 
at nio.FileVisitorForTest.main(FileVisitorForTest.java:25) 

请帮我了解这个情况。谢谢你们!

Ps:我的操作系统是Windows 7 64位。

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

,但我仍然不知道为什么:

更新:此错误可以通过在postVisitDirectory增加一个线程来克服()方法是这样的。

回答

1

文件夹在浏览器窗口中仍处于打开状态时无法删除。它是Windows的东西,而不是Java的东西。

+0

感谢您的快速评论,但在这种情况下,我没有打开包含删除文件夹的驱动器。该文件夹在驱动器E:但我打开驱动器C:上的窗口文件浏览器。 – programer310

1

您可以检查文件是否被另一个进程锁定。

File file = new File(“some_file.txt”); System.out.println(file.canWrite());

+0

谢谢你的回答,但我确定该文件没有被任何进程锁定,因为我没有打开删除文件夹中的任何内容。 – programer310

+0

嘿,我运行你的代码,并且只能在程序锁定任何文本文件(记事本)时重新创建你的案例。你可以请仔细检查,他们没有在使用之前删除发生(尝试重命名他们或什么) –

+0

我通过更改txt文件的文件名,并且这个错误仍然发生(如果我不使用在postVisitDirectory()方法中的Thread.sleep())。 – programer310

相关问题