跳转至内容

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

灵感大王
4 3 221 1
  • 本文使用:CC-BY-NC-SA 4.0协议

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

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

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

      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()呢。

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

      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()呢。

    @BerriesAdmin

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

    其實可以直接改成

    Client.gameDirectory;
    
  • @BerriesAdmin

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

    其實可以直接改成

    Client.gameDirectory;
    

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


相关推荐