症状很简单:Windows拒绝删除目录,因为它认为其内容仍然存在 - 尽管递归删除只是删除了它们。所以我的第一个猜测是,在删除其内容之后和删除之前,父目录中存在刷新/同步或类似缺失。
我尝试了commons-io版本2.5 FileUtils.deleteDirectory和FileUtils.cleanDirectory函数以及我自己的简化测试:
@Test
public void testMySimpleDelete() throws IOException, InterruptedException {
File dir = TEST_DIR;
for (int i = 0; i < 10; i++) {
dir = new File(dir, Integer.toString(i));
}
for (int i = 0; i < 1000; i++) {
LOG.info(""+i);
assertTrue("loop #" + i, dir.mkdirs());
mySimpleDelete(Paths.get(TEST_DIR.getAbsolutePath()));
assertFalse(TEST_DIR.exists());
}
}
private void mySimpleDelete(Path file) throws IOException, InterruptedException {
Files.walkFileTree(file, new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
//LOG.info(dir.toString());
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
}
所有显示相同的结果/症状。
如果你想为自己验证这种行为(仅在Windows上!Linux根本没有锁定任何东西并且行为方式更宽松),只需查看https://github.com/jjYBdx4IL/java-evaluation并运行&#34; mvn test -Dtest = org.apache.commons.io.FileUtilsTest&#34;
答案 0 :(得分:1)
问题是TortoiseGIT 再次。上次它是如此愚蠢,并没有配置其打包的git.exe并使用我的cygwin安装中的那个,这导致了问题,浪费了我的时间。
现在,在这种情况下,用于在Windows资源管理器中显示状态图标的状态缓存甚至会扫描git-ignored构建和测试目录,从而锁定其中的内容... omg。太糟糕了。
解决方案:
TortoiseGIT -> Settings -> Icon Overlays -> Status Cache set to None