dousha0v0
目前的想法是使用File类,当插件卸载时删除region下所有的文件。以下是我的代码
  1. public class ReWorldTask extends JavaPlugin {
  2.         static int flag = 1;
  3.         File file = new File(this.getConfig().getString("Path"));


  4.         @Override
  5.         public void onEnable() {
  6.                 this.getConfig().options().copyDefaults(true);
  7.                 this.saveConfig();
  8.         }

  9.         @Override
  10.         public void onDisable() {
  11.                 if (file.exists()) {
  12.                         deleteFile(file);
  13.                 }
  14.                 if (flag == 1){
  15.                         System.out.println("地图回档成功!");
  16.                 }
  17.         }


  18.         @Override
  19.         public void onLoad() {

  20.         }
  21.         public static void deleteFile(File file){
  22.                 if (file == null || !file.exists()){
  23.                         flag = 0;
  24.                         System.out.println("文件删除失败,请检查文件路径是否正确");
  25.                         return;
  26.                 }
  27.                 File[] files = file.listFiles();
  28.                 for (File f: files){
  29.                         String name = file.getName();
  30.                         System.out.println(name);
  31.                         if (f.isDirectory()){
  32.                                 deleteFile(f);
  33.                         }else {
  34.                                 f.delete();
  35.                         }
  36.                 }
  37.                 file.delete();
  38.         }
复制代码
以及我的config.yml
  1. enable: true

  2. Path: K:/开发/服务端/开发测试端/world/region
复制代码



洞穴夜莺
插件卸载的时候不一定区域文件也保存了吧
最近我也在尝试使用Mod做类似的事情,暂时还在探索

Jesenv5
如果我没记错,是插件先卸载然后才保存的世界存档吧。

dousha0v0
region文件夹删除不掉

天辉胡萝卜
如果是自己创造的世界,直接unload之后就可以随意操作了
对于world等不好解决

晴天雨水

从纯Java角度(不涉及Bukkit特定方法)提供两个思路.


JVM关闭钩子

在插件运行期间向JVM注册虚拟机关闭钩子函数以在虚拟机关闭时执行特定操作.
具体参考java.lang.Runtime.addShutdownHook()的Javadoc
优点在于实现简单,资源消耗少
缺点在于如果虚拟机非正常退出,那钩子函数就不会运行.
这种方法需要MC服务器一定在虚拟机关闭钩子函数执行前完成世界保存等操作.


进程监视

在onDisabled时创建一个新的进程监视MC服务器进程,一旦服务器进程关闭则执行特定操作.
难点在于进程的启动,Java貌似还没有方便的启动进程的方法.
并且这种方法资源消耗很大,毕竟开了一个JVM进程.
(监视进程也可以不基于Java, C++等语言也可以)
优点是不论虚拟机是如何退出的,都可以有效执行操作.


以上两种方法假设了在MC服务器运行期间地图文件被占用无法删除的情况
如果可以删除那这条回帖就没什么用了.




xiao_chen_520
火热环境条件的推荐大家

dousha0v0

虽然对我来说有点超纲了,但还是感谢!
region下的文件确实只用java是删除不了的

819875819
emmm阿巴阿巴

洞穴夜莺
dousha0v0 发表于 2020-9-1 18:56
虽然对我来说有点超纲了,但还是感谢!
region下的文件确实只用java是删除不了的 ...

region文件夹下的文件只是普通文件,肯定是用Java能删掉的
但是服务器卸载文件时会重新保存文件,这是主要问题
我不清楚你所说的删不掉是指什么现象?

dousha0v0
洞穴夜莺 发表于 2020-9-4 19:45
region文件夹下的文件只是普通文件,肯定是用Java能删掉的
但是服务器卸载文件时会重新保存文件,这是主 ...

也就是说把删除操作放在onload的时候,就可以了?

洞穴夜莺
本帖最后由 洞穴夜莺 于 2020-9-4 22:33 编辑
dousha0v0 发表于 2020-9-4 21:41
也就是说把删除操作放在onload的时候,就可以了?

理论上需要在服务器卸载所有区块之后,例如6楼那位说的
或者想办法让服务器每次启动都重新生成区块而不是从文件读取

MH丶猫叔
阿巴阿巴

50828188801
6666666666