目前的想法是使用File类,当插件卸载时删除region下所有的文件。以下是我的代码
复制代码以及我的config.yml
复制代码
- public class ReWorldTask extends JavaPlugin {
- static int flag = 1;
- File file = new File(this.getConfig().getString("Path"));
- @Override
- public void onEnable() {
- this.getConfig().options().copyDefaults(true);
- this.saveConfig();
- }
- @Override
- public void onDisable() {
- if (file.exists()) {
- deleteFile(file);
- }
- if (flag == 1){
- System.out.println("地图回档成功!");
- }
- }
- @Override
- public void onLoad() {
- }
- public static void deleteFile(File file){
- if (file == null || !file.exists()){
- flag = 0;
- System.out.println("文件删除失败,请检查文件路径是否正确");
- return;
- }
- File[] files = file.listFiles();
- for (File f: files){
- String name = file.getName();
- System.out.println(name);
- if (f.isDirectory()){
- deleteFile(f);
- }else {
- f.delete();
- }
- }
- file.delete();
- }
- enable: true
- Path: K:/开发/服务端/开发测试端/world/region
插件卸载的时候不一定区域文件也保存了吧
最近我也在尝试使用Mod做类似的事情,暂时还在探索
最近我也在尝试使用Mod做类似的事情,暂时还在探索
如果我没记错,是插件先卸载然后才保存的世界存档吧。
region文件夹删除不掉
如果是自己创造的世界,直接unload之后就可以随意操作了
对于world等不好解决
对于world等不好解决
从纯Java角度(不涉及Bukkit特定方法)提供两个思路.
JVM关闭钩子
在插件运行期间向JVM注册虚拟机关闭钩子函数以在虚拟机关闭时执行特定操作.
具体参考java.lang.Runtime.addShutdownHook()的Javadoc
优点在于实现简单,资源消耗少
缺点在于如果虚拟机非正常退出,那钩子函数就不会运行.
这种方法需要MC服务器一定在虚拟机关闭钩子函数执行前完成世界保存等操作.
进程监视
在onDisabled时创建一个新的进程监视MC服务器进程,一旦服务器进程关闭则执行特定操作.
难点在于进程的启动,Java貌似还没有方便的启动进程的方法.
并且这种方法资源消耗很大,毕竟开了一个JVM进程.
(监视进程也可以不基于Java, C++等语言也可以)
优点是不论虚拟机是如何退出的,都可以有效执行操作.
以上两种方法假设了在MC服务器运行期间地图文件被占用无法删除的情况
如果可以删除那这条回帖就没什么用了.
火热环境条件的推荐大家
emmm阿巴阿巴
dousha0v0 发表于 2020-9-1 18:56
虽然对我来说有点超纲了,但还是感谢!
region下的文件确实只用java是删除不了的 ...
region文件夹下的文件只是普通文件,肯定是用Java能删掉的
但是服务器卸载文件时会重新保存文件,这是主要问题
我不清楚你所说的删不掉是指什么现象?
洞穴夜莺 发表于 2020-9-4 19:45
region文件夹下的文件只是普通文件,肯定是用Java能删掉的
但是服务器卸载文件时会重新保存文件,这是主 ...
也就是说把删除操作放在onload的时候,就可以了?
本帖最后由 洞穴夜莺 于 2020-9-4 22:33 编辑
理论上需要在服务器卸载所有区块之后,例如6楼那位说的
或者想办法让服务器每次启动都重新生成区块而不是从文件读取
dousha0v0 发表于 2020-9-4 21:41
也就是说把删除操作放在onload的时候,就可以了?
理论上需要在服务器卸载所有区块之后,例如6楼那位说的
或者想办法让服务器每次启动都重新生成区块而不是从文件读取
阿巴阿巴
6666666666