Java (JGIT) Files.delete() 删除文件失败,但 file.delete() 成功

2024-04-24

我正在使用 jgit (版本4.8.0.201706111038-r)并添加一个关闭钩子以在终止后删除临时目录。但是,关闭挂钩无法从内部删除某些文件.git子目录(尽管按照 jgit 的要求关闭了 Git 对象)。

但有趣的是,只有当我使用 Path API 时,删除才会失败(Files.delete(<PATH>)),但如果我使用旧的删除则不会file.delete().

这是一个最小的独立示例,其唯一依赖项是 jgit 4.8.0.201706111038-r:

public static void main(String... args) throws Exception {
    String gitRepo = "https://github.com/netgloo/spring-boot-samples.git";
    Path localDir = Files.createTempDirectory(null);

    // Clone repo
    Git git = Git.cloneRepository().setURI(gitRepo).setBranch("master").setDirectory(localDir.toFile()).call();

    // Print some stuff to make sure that the git repo actually works
    for (RevCommit c : git.log().call()) {
        System.out.println(c);
    }

    git.getRepository().close(); // Close all the things!
    git.close(); // Close all the things!

    // Delete
    Files.walkFileTree(localDir, new SimpleFileVisitor<Path>() {
        void safeDelete(Path p) {
            try {
                Files.delete(p);
            } catch (Exception e) {
                try {
                    Files.delete(p);
                } catch (Exception e2) {
                    System.err.println("Failed to delete " + p + " due to " + e.getClass().getSimpleName() + " using Files.detlete().\nTrying toFile().delete(): " + p.toFile().delete());
                }
            }
        }

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

        @Override
        public FileVisitResult postVisitDirectory(Path dir, IOException e) throws IOException {
            safeDelete(dir);
            return FileVisitResult.CONTINUE;
        }
    });
}

Output:

...
Failed to delete C:\Users\malt\AppData\Local\Temp\7908805853015958247\.git\objects\pack\pack-9cc3ec0769e34546bb7683f4e22ef67b3c800444.idx due to AccessDeniedException using Files.detlete().
Trying toFile().delete(): true
Failed to delete C:\Users\malt\AppData\Local\Temp\7908805853015958247\.git\objects\pack\pack-9cc3ec0769e34546bb7683f4e22ef67b3c800444.pack due to AccessDeniedException using Files.detlete().
Trying toFile().delete(): true

谁能解释为什么会发生这种情况?有没有办法让 JGIT 正确关闭这些文件,以便Files.delete() works?


当从一个获得CloneCommand, Git::close仅此一项就足以释放 JGit 为给定存储库持有的所有文件句柄。它只是委托给Repository::close在这种情况下。

我认为之间的区别Files::delete() and File::delete()您所看到的解释如下:

Files#delete(Path) 和 File#delete() 之间的区别 https://stackoverflow.com/questions/12139482/difference-between-filesdeletepath-and-filedelete

可能不相关,但我认为仍然值得一提的是最近引入的自动垃圾回收后台线程的问题。它还可能会阻止存储库被成功删除。请参阅此邮件列表主题:

https://dev.eclipse.org/mhonarc/lists/jgit-dev/msg03370.html https://dev.eclipse.org/mhonarc/lists/jgit-dev/msg03370.html

为了解决后一个问题,我在存储库的配置中禁用了 auto-gc,如下所示:

StoredConfig config = repository.getConfig();
config.setBoolean(CONFIG_GC_SECTION, null, CONFIG_KEY_AUTODETACH, false);
config.setInt(CONFIG_GC_SECTION, null, CONFIG_KEY_AUTOPACKLIMIT, -1);
config.setInt(CONFIG_GC_SECTION, null, CONFIG_KEY_AUTO, -1);
config.save();

常量是静态导入的ConfigConstants.

这符合你的问题吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java (JGIT) Files.delete() 删除文件失败,但 file.delete() 成功 的相关文章

随机推荐

  • 如何平移 UIImageView 内的图像?

    我有一个UIImageView显示比实际图像更宽和更高的图像UIImageView是 我想使用动画在视图中平移图像 以便平移漂亮且平滑 在我看来 我应该能够调整bounds origin of the UIImageView 并且图像应该移
  • 如何在ubuntu 12.0中更新openerp 7中的新模块? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 完成 在 ubuntu 12 0 中更新 openerp 7 中的新模块的所有可能方法 还有其他方法可以更新 ubuntu 12 0 中
  • 如何在flutter中解析json?

    我想创建一个新闻应用程序 并且我使用 newsapi org 作为来源 我正在尝试获取来自 Http 库的 JSON 数据 我在下面提供了完整的代码 它没有给我任何错误 但没有加载数据 当我打印数据时 它打印一切正常 但我无法显示它 我不知
  • 如何在 QML 中使用 Font Awesome

    有谁知道如何在 QML 中使用 Font Awesome 吗 我找不到任何文档或任何信息如何在 QML 中使用 Font Awesome 我喜欢做的是使用fontello http fontello com 创建最小的图标集 而不是从 Fo
  • 在 UIWebView 中更改用户代理

    我的业务需要能够为嵌入式 UIWebView 自定义 UserAgent 例如 如果用户使用应用程序的一个版本与另一个版本 我希望服务器做出不同的响应 是否可以像 Windows 应用程序中的嵌入式 IE 浏览器那样在现有 UIWebVie
  • 查找多模块 Maven Reactor 项目的根目录

    有没有一种简单的方法可以找到多模块 Maven 项目的根 例如 Gradle 的rootDir 背景 我想使用 maven dependency plugin 将多模块项目的所有子模块中的工件复制到相对于整个项目的根目录的目录 也就是说 我
  • 如何在 XAML 上设置 ResourceDictionary FontSize?

    如果这会是一件混乱的事情 我深表歉意 我对 Xamarin 还很陌生 目前我正在尝试将此资源字典代码转换为 XAML Current Resources new ResourceDictionary FontResources Defaul
  • 设计 EAP-TLS 客户端问候消息

    我正在尝试设计第一个启动 EAP TLS 握手的数据包 这是我的数据包目前的样子 我通过用相应的信息手动填充 C 中的缓冲区来设计 EAP 部分 我使用 OpenSSL 导出的 TLS 部分如图所示在这个问题中 https stackove
  • 如何在 MS Access 表单上动态保持控件居中(相对位置)?

    我正在使用 Access 2013 并且有许多控件 列表框 按钮等 当调整表单大小时 我希望它们作为一个组在表单上保持居中 锚定无法实现我正在寻找的目标 因为我不想将控件锁定到顶部 底部 左侧 右侧 我希望他们留在中心 只需使用这样的代码m
  • 在 C++ 中清除控制台

    我正在尝试清除 C 中的控制台 我知道打印多个换行符是一种不好的做法 因为它可能很慢 并且完全清除控制台窗口并不总是可靠的 但我研究了多种选项 除了发现几乎没有其他解决方案system cls 这是一个更糟糕的选择 本质上 我用过这条线co
  • 输入:页面加载时应用了无效的 css 规则

    在 Firefox 或 Chrome 中查看这两个 fiddle 在this http jsfiddle net hezgkxoh 2 一 我只有一个简单的表格required属性和一个submit按钮 当框为空时按 提交 会导致其样式为i
  • 参数化方法调用什么时候有用?

    Java 方法调用可以像下面的代码一样进行参数化 class Test
  • 典型的按键持续时间是多少

    我正在固件项目中做一些关于按键处理的工作 我一直在谷歌上搜索 试图找出按键的典型持续时间是多少 特别是快速打字员的最短持续时间 令人惊讶的是我在任何地方都找不到任何相关数据 最近有一些关于按键时序的研究已经发表 这里有两个 http www
  • 如何在 .NET 中可靠地获取图像尺寸而不加载图像?

    我知道如何获取图像的大小 x y Image FromFile cat jpg Size 但这需要从内存中加载图像 当我在 Windows 资源管理器中查看图像时 它会显示尺寸 我如何访问该大小 它对所有图像都可靠吗 Windows 资源管
  • 什么日历似乎是从 1800 年 12 月 28 日开始计算天数的?

    我的任务是从一些奇怪的旧系统中读取一些数据 该系统包含许多日期 但它们的格式都很奇怪 它们是整数 范围约为55 000 to 80 000 我确定有两个日期 58 112 equals February 5 1960 originally
  • 为什么我不能在 python 的 for 循环中重新分配变量? [复制]

    这个问题在这里已经有答案了 今天我发现一个有趣的事实 我无法在 for 循环 中重新分配变量 但为什么呢 这是我的代码 gt gt gt my list 1 2 3 4 5 gt gt gt for i in my list gt gt g
  • WCF - 如何在 JSON 中序列化和反序列化?

    我在 WCF 中编写了几个类 数据契约和服务契约 并且尝试在 JSON 中进行序列化和反序列化 如果我需要以下 JSON 结构 我将如何创建 DataContract s response locations location id 12
  • 在 JavaScript 中查找文本字符串

    我有一个很大的有效 JavaScript 文件 utf 8 我需要从中自动提取所有文本字符串 为简单起见 该文件不包含任何注释块 仅包含有效的 ES6 JavaScript 代码 一旦我发现发生 or 或 我应该扫描文本块的末尾 这是我陷入
  • TypeError:expect(...).to.startsWith 不是一个函数 - chai 和 chakram

    我开始编写一些自动化测试 API 现在我尝试对此端点执行以下操作 https dog ceo api breeds image random https dog ceo api breeds image random 所以我添加到我的函数中
  • Java (JGIT) Files.delete() 删除文件失败,但 file.delete() 成功

    我正在使用 jgit 版本4 8 0 201706111038 r 并添加一个关闭钩子以在终止后删除临时目录 但是 关闭挂钩无法从内部删除某些文件 git子目录 尽管按照 jgit 的要求关闭了 Git 对象 但有趣的是 只有当我使用 Pa