如何删除被Java平台锁定的文件?
How to delete a file locked by the Java Platform?
我目前正在开发一个应用程序,它在每次用户登录时克隆 Git 个存储库,这要归功于 JGit (http://wiki.eclipse.org/JGit/User_Guide)。当用户想要退出应用程序时,我想删除克隆。
这是问题所在:克隆存储库时,会创建一个文件夹 .git,其中可以找到一个文件 .pack (.git/objects/pack/sutpideFile.pack) 并且无法删除,因为 Java 平台正在锁定它(尝试手动删除它时,出现错误“无法完成操作,因为文件已在 Java(TM) Platform SE 二进制文件中打开”)。
这是 Jgit 的一个已知问题:.pack file from git repo can't be deleted using File delete() method。
因此,我使用了此处提出的解决方案:https://github.com/ajoberstar/grgit/issues/33,即在我的删除方法之前添加这三行:
WindowCacheConfig 配置 = new WindowCacheConfig();
config.setPackedGitMMAP(真);
WindowCache.install(配置);
但真正困扰我的是,因为我不明白这个解决方案只工作一次:我启动服务器(TomCat),连接,然后断开连接。在这里,整个文件夹被删除。但是,当我重新连接和断开连接(不重新启动服务器)时,文件会反叛,并且在我关闭服务器之前我无法再删除它。
有没有人知道它为什么有效,但只有一次?
感谢您的帮助,
编辑:
好吧,所以当我完成使用 Git 对象时,我只需要添加 git.getRepository().close(); 。那么删除是可以的!
这是一个know bug in JGit, see the discussion at
基本上,您目前需要添加对 "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 计划对此进行修复。
我目前正在开发一个应用程序,它在每次用户登录时克隆 Git 个存储库,这要归功于 JGit (http://wiki.eclipse.org/JGit/User_Guide)。当用户想要退出应用程序时,我想删除克隆。
这是问题所在:克隆存储库时,会创建一个文件夹 .git,其中可以找到一个文件 .pack (.git/objects/pack/sutpideFile.pack) 并且无法删除,因为 Java 平台正在锁定它(尝试手动删除它时,出现错误“无法完成操作,因为文件已在 Java(TM) Platform SE 二进制文件中打开”)。
这是 Jgit 的一个已知问题:.pack file from git repo can't be deleted using File delete() method。
因此,我使用了此处提出的解决方案:https://github.com/ajoberstar/grgit/issues/33,即在我的删除方法之前添加这三行:
WindowCacheConfig 配置 = new WindowCacheConfig();
config.setPackedGitMMAP(真);
WindowCache.install(配置);
但真正困扰我的是,因为我不明白这个解决方案只工作一次:我启动服务器(TomCat),连接,然后断开连接。在这里,整个文件夹被删除。但是,当我重新连接和断开连接(不重新启动服务器)时,文件会反叛,并且在我关闭服务器之前我无法再删除它。
有没有人知道它为什么有效,但只有一次?
感谢您的帮助,
编辑: 好吧,所以当我完成使用 Git 对象时,我只需要添加 git.getRepository().close(); 。那么删除是可以的!
这是一个know bug in JGit, see the discussion at
基本上,您目前需要添加对 "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 计划对此进行修复。