没有可靠的递归目录删除可能吗?

时间:2017-04-25 15:00:27

标签: java windows

症状很简单: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;

1 个答案:

答案 0 :(得分:1)

问题是TortoiseGIT 再次。上次它是如此愚蠢,并没有配置其打包的git.exe并使用我的cygwin安装中的那个,这导致了问题,浪费了我的时间。

现在,在这种情况下,用于在Windows资源管理器中显示状态图标的状态缓存甚至会扫描git-ignored构建和测试目录,从而锁定其中的内容... omg。太糟糕了。

解决方案:

TortoiseGIT -> Settings -> Icon Overlays -> Status Cache set to None