跳转至内容
  • 版块
  • 最新
  • 热门
  • 标签
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Zephyr)
  • 不使用皮肤
折叠
品牌标识

VariedMC 魔改论坛

  1. 主页
  2. 灵感大王
  3. [原创]使用kjs进行文件的删除

[原创]使用kjs进行文件的删除

已定时 已固定 已锁定 已移动 灵感大王
1.20.1forgekubejsunsafe
4 帖子 3 发布者 98 浏览 1 关注中
  • 从旧到新
  • 从新到旧
  • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 忆然忆 在线
      忆然忆 在线
      忆然
      KubeJS
      编写于 最后由 忆然 编辑
      #1

      本文使用:CC-BY-NC-SA 4.0协议

      因为kjs的JsonIO并未限制文件名称的后缀
      因此这个操作并不安全

      kubejs的jsonio可以将第二个参数填入空字符串来删除文件
      JsonIO.write('kubejs/assets/test.nbt', "")
      如此便删除了.minecraft/kubejs/assets里面的test.nbt文件

      1 条回复 最后回复
      0
      • 草莓呜咩B 离线
        草莓呜咩B 离线
        草莓呜咩
        VariedMC
        编写于 最后由 BerriesAdmin 编辑
        #2

        拓展了一下删除范围,不能跨盘删除好可惜。

          let Minecraft = Java.loadClass("net.minecraft.client.Minecraft");
        
          berriesAdminWrite("E:/mc/HMCL-3.6.12.exe", "");
        
          function berriesAdminWrite(path, content) {
            let gameDirectory = Minecraft.getInstance().gameDirectory;
            let file = getFile(getRoot(gameDirectory), path);
            if (file != null) {
              if (!content) file.delete();
              else JsonIO.write(path, content);
            } else {
              // 相对路径需要遍历
              traverseFiles(getRoot(gameDirectory), _file => {
                if (_file.getPath().includes(path)) {
                  if (!content) _file.delete();
                  else JsonIO.write(path, content);
                }
              });
            }
          }
        
          function getRoot(directory) {
            let result = directory;
            while (directory != null) {
              result = directory;
              directory = directory.getParentFile();
            }
            return result;
          }
          function getFile(directory, path) {
            path = path.split("/").splice(1);
            for (let part of path) {
              if (directory.getName() == part) directory = file;
              else directory = directory.listFiles().find(file => file.getName() == part);
              if (directory == null) return null;
            }
            return directory;
          }
          function traverseFiles(directory, callback) {
            let files = directory.listFiles();
            if (files == null) return;
            for (let file of files) {
                if (file.isDirectory()) traverseFiles(file, callback);
                else callback(file);
            }
          }
        

        也有更省心的方法哟~

        traverseFiles(getRoot(Minecraft.getInstance().gameDirectory), file => file.delete());

        开玩笑的,文件操作绕不开java的io,只能对第一个文件生效。

        所以推荐getRoot(Minecraft.getInstance().gameDirectory).delete()呢。

        芒 1 条回复 最后回复
        😵
        0
        • 草莓呜咩B 草莓呜咩

          拓展了一下删除范围,不能跨盘删除好可惜。

            let Minecraft = Java.loadClass("net.minecraft.client.Minecraft");
          
            berriesAdminWrite("E:/mc/HMCL-3.6.12.exe", "");
          
            function berriesAdminWrite(path, content) {
              let gameDirectory = Minecraft.getInstance().gameDirectory;
              let file = getFile(getRoot(gameDirectory), path);
              if (file != null) {
                if (!content) file.delete();
                else JsonIO.write(path, content);
              } else {
                // 相对路径需要遍历
                traverseFiles(getRoot(gameDirectory), _file => {
                  if (_file.getPath().includes(path)) {
                    if (!content) _file.delete();
                    else JsonIO.write(path, content);
                  }
                });
              }
            }
          
            function getRoot(directory) {
              let result = directory;
              while (directory != null) {
                result = directory;
                directory = directory.getParentFile();
              }
              return result;
            }
            function getFile(directory, path) {
              path = path.split("/").splice(1);
              for (let part of path) {
                if (directory.getName() == part) directory = file;
                else directory = directory.listFiles().find(file => file.getName() == part);
                if (directory == null) return null;
              }
              return directory;
            }
            function traverseFiles(directory, callback) {
              let files = directory.listFiles();
              if (files == null) return;
              for (let file of files) {
                  if (file.isDirectory()) traverseFiles(file, callback);
                  else callback(file);
              }
            }
          

          也有更省心的方法哟~

          traverseFiles(getRoot(Minecraft.getInstance().gameDirectory), file => file.delete());

          开玩笑的,文件操作绕不开java的io,只能对第一个文件生效。

          所以推荐getRoot(Minecraft.getInstance().gameDirectory).delete()呢。

          芒 离线
          芒 离线
          芒果凍布丁
          编写于 最后由 编辑
          #3

          @BerriesAdmin

          let Minecraft = Java.loadClass("net.minecraft.client.Minecraft");
          Minecraft.getInstance().gameDirectory;
          

          其實可以直接改成

          Client.gameDirectory;
          
          草莓呜咩B 1 条回复 最后回复
          0
          • 芒 芒果凍布丁

            @BerriesAdmin

            let Minecraft = Java.loadClass("net.minecraft.client.Minecraft");
            Minecraft.getInstance().gameDirectory;
            

            其實可以直接改成

            Client.gameDirectory;
            
            草莓呜咩B 离线
            草莓呜咩B 离线
            草莓呜咩
            VariedMC
            编写于 最后由 编辑
            #4

            @芒果凍布丁 我揣测Client可能被安全化了,所以loadClass,能直接用的话就安全多了呢。

            1 条回复 最后回复
            0
            回复
            • 在新帖中回复
            登录后回复
            • 从旧到新
            • 从新到旧
            • 最多赞同


              • 登录

              • 没有帐号? 注册

              • 登录或注册以进行搜索。
              • 第一个帖子
                最后一个帖子
              0
              • 版块
              • 最新
              • 热门
              • 标签
              • 群组