当前位置: 首页 > 知识库问答 >
问题:

如何删除被Java平台锁定的文件?

荣俊
2023-03-14

我目前正在开发一个应用程序,该应用程序在每次用户登录时都借助 JGit (http://wiki.eclipse.org/JGit/User_Guide) 克隆 Git 存储库。当用户想要退出应用程序时,我想删除克隆。问题是:克隆存储库时,会创建一个文件夹 .git,在其中可以找到一个文件 .pack (.git/objects/pack/sutpideFile.pack),并且无法删除,因为 Java 平台正在锁定它(尝试手动删除它时,收到错误“操作无法完成,因为文件在 Java(TM) 平台 SE 二进制文件中打开”)。

这是 J 的已知问题git :不能使用 File delete() 方法删除 git 存储库中的 .pack 文件。因此,我使用了这里提出的解决方案:https://github.com/ajoberstar/grgit/issues/33 在我的删除方法之前添加这三行:
WindowCacheConfig config = new WindowCacheConfig();
config.setPackedGitMMAP(true);
WindowCache.install(config);

但是真正困扰我的是因为我不明白的是这个解决方案只工作一次:我启动服务器(TomCat),连接,然后断开连接。在这里,整个文件夹被删除。但是,当我重新连接并断开连接(与重新启动服务器),那里有反叛文件,在关闭服务器之前我无法再删除它。

有没有人最清楚为什么它有效,但只有一次?

感谢您的帮助,

编辑 : 好吧,所以我只需要添加 git.getRepository().close();当我完成使用 Git 对象时。那么删除是可能的!

共有1个答案

郑锋
2023-03-14

这是 JGit 中的一个已知错误,请参阅通过 JGit 克隆存储库后如何释放文件系统锁中的讨论

基本上,您当前需要添加对“Git.getRepository().close()”的调用,以便释放所有文件系统锁,直到发布新版本的JGit。

result = Git.cloneRepository()
        .setURI( 'https://github.com/github/testrepo.git' )
        .setDirectory( localPath )
        .call();

// this is currently necessary to free all file locks
result.getRepository().close();

result.close();

JGit 4.1计划对此进行修复。

 类似资料:
  • 问题内容: 我有模块应用程序。当我运行它时,该应用程序的主窗口具有相当复杂的菜单。如何从菜单中删除一些项目? 问题答案: 您可以通过将条目添加到项目的layer.xml文件中来从菜单栏中删除菜单项。 您应该通读“ NetBeans平台HTML编辑器”教程中的“调整用户界面”, 以大致了解您需要做什么。 还有另一个使用层文件隐藏项目的教程式说明。

  • 我正在使用ApacheCamel文件组件从本地目录读取数据并上传到AWS S3存储桶。这条路线在过去工作得很完美,但现在每天都有一些文件出现问题。 在我迄今为止的调试调查(3天的痛苦)中,我发现该路由到达了类,并且在交换上没有设置任何异常(供参考,请参阅下面前面提到的类的相关代码)。考虑到没有任何异常,我似乎无法弄清楚为什么方法从不针对特定文件触发。有问题的文件没有/没有任何异常;但是,在所有逻辑

  • 我正在尝试调整图像的大小。首先,我将图像读入字节数组,在内存中调整大小并将其写回同一个文件: 但是,通常会出现以下错误: 进程无法访问文件:'C:\folder\image.jpg',因为它正被另一个进程使用。 为什么会这样?我会假设File. ReadAllBytes()会自动关闭文件? 进程资源管理器中没有显示文件句柄或锁(这似乎很奇怪)。 即使我在while循环中添加了一些延迟,循环也永远不

  • 问题内容: 我完全没有使用Windows API的经验,所以请原谅我的无知。 我想删除文件到回收站。如何使用JNA做到这一点,以及如何检测是否不可能(例如,由于文件位于网络共享上)? 问题答案: 使用已定义和方法的。

  • 我对此真的很困惑。如果我以编程方式删除Firest集合中的所有文档,集合本身也会被删除: 但是,如果我在线使用Firebase控制台删除所有文档,我并不总是看到集合被删除!我从字面上删除了集合中的所有文档,但它仍然在控制台中。我可以立即在集合中创建另一个文档。但有时集合确实会消失......?! 我读了一些帖子,比如删除Firestore收藏中的所有文件,但没有看到任何解释这一点的内容。 因为一个

  • 问题内容: 我的Java程序想要读取一个文件,该文件可以被另一个写入该文件的程序锁定。我需要检查文件是否已锁定,如果已锁定,请等待它释放。我该如何实现? Java程序在Windows 2000服务器上运行。 问题答案: 在带有Sun JVM的Windows下,尽管JavaDoc保留了相当模糊的可靠性(取决于系统),但FileLocks应该可以正常工作。 但是,如果您只需要在Java程序中识别出 其

  • 问题内容: 我有几个线程(其中一些由进程X产生,其他由进程Y 等产生 ),并且每个线程都需要写入文件。但是,如果开始写第一,那么,当开始写作,它需要等待到 释放文件 ,以便它可以读取写在该内容。换句话说,每个线程都会有一个方法,如下所示: 我的问题是:如何完成以上代码?我正在研究该类,但是它在Javadoc中说: “文件锁代表整个Java虚拟机持有。它们不适合控制同一虚拟机中多个线程对文件的访问。

  • 问题内容: 尝试删除不为空的文件夹时,出现“访问被拒绝”错误。我尝试使用以下命令:。 删除/删除不为空的文件夹/目录的最有效方法是什么? 问题答案: 标准库参考:shutil.rmtree。 根据设计,在包含只读文件的文件夹树上失败。如果要删除该文件夹而不管它是否包含只读文件,请使用