zfile icon indicating copy to clipboard operation
zfile copied to clipboard

自动创建 sqlite.db 的路径问题导致创建失败

Open sleepybear1113 opened this issue 2 years ago • 1 comments

为了帮助我们更好的解决您的问题,请填写以下选项(不填写完整可能会被直接关闭 issue):

  • 是否已搜索其他 issue,没有人提过这个问题?:y

  • 是否已查阅、搜索 ZFile 文档,尤其是常见问题页,仍然未解决?:y

  • 当前 ZFile 版本:最新开源 4.1.5

  • 项目路径:Windows 下 D:\Code\Java\Spring\zfile

  • 问题:修改 application.properties(我这里改成 yml 了)中 sqlite 的 path,改为非 ${user.home}/.zfile-v4/db/zfile 的绝对路径,使用了相对路径 zfile-v4/db/zfile.db。出现了创建 db 文件失败的情况。

  • 涉及 Java 文件:im.zhaojun.zfile.core.config.MyBatisPlusConfig#init

  • 原因:使用 java8 debug 后,发现 hutool 的 FileUtil 中所有操作文件的都是基于 classpath 的。也就是说,FileUtil.getParent(path, 1) 返回的是基于 classpath 的地址(我这是 D:\Code\Java\Spring\zfile\target\classes\zfile-v4\db)而不是 D:\Code\Java\Spring\zfile\zfile-v4\db。导致了 db 文件创建到不应该的地方。这里附上 hutool 官方解释的 issue 链接:issue2559。同时附上 debug 的图:zfile-debug

  • 我的理解:修改配置文件后,使用相对路径创建的 sqlite.db 应该是在 jar 包同级目录,而不是走的 classpath。导致使用相对路径后,出现了带 ! 的文件夹,如图 带感叹号文件夹

  • 解决:不使用 hutool 的 FileUtil.getParent 函数,使用原生的 File 来新建多级路径。目前我改成如下,默认参数的路径和相对路径均测试通过。

public void init() {
        if (StrUtil.equals(datasourceDriveClassName, "org.sqlite.JDBC")) {
            String path = datasourceUrl.replace("jdbc:sqlite:", "");
            String folderPath = FileUtil.getAbsolutePath(new File(path).getParentFile());
            log.info("SQLite 数据库文件所在目录: [{}]", folderPath);
            File file = new File(folderPath);
            if (!file.exists()) {
                log.info("检测到 SQLite 数据库文件所在目录不存在, 已自动创建.");
                if (!file.mkdirs()) {
                    log.error("SQLite 数据库文件创建失败.");
                }
            } else {
                log.info("检测到 SQLite 数据库文件所在目录已存在, 无需自动创建.");
            }
        }
    }

sleepybear1113 avatar Jul 26 '23 16:07 sleepybear1113

下版本修复

---原始邮件--- 发件人: @.> 发送时间: 2023年7月27日(周四) 凌晨0:57 收件人: @.>; 抄送: @.***>; 主题: [zfile-dev/zfile] 自动创建 sqlite.db 的路径问题导致创建失败 (Issue #568)

为了帮助我们更好的解决您的问题,请填写以下选项(不填写完整可能会被直接关闭 issue):

是否已搜索其他 issue,没有人提过这个问题?:y

是否已查阅、搜索 ZFile 文档,尤其是常见问题页,仍然未解决?:y

当前 ZFile 版本:最新开源 4.1.5

项目路径:Windows 下 D:\Code\Java\Spring\zfile

问题:修改 application.properties(我这里改成 yml 了)中 sqlite 的 path,改为非 ${user.home}/.zfile-v4/db/zfile 的绝对路径,使用了相对路径 zfile-v4/db/zfile.db。出现了创建 db 文件失败的情况。

涉及 Java 文件:im.zhaojun.zfile.core.config.MyBatisPlusConfig#init

原因:使用 java8 debug 后,发现 hutool 的 FileUtil 中所有操作文件的都是基于 classpath 的。也就是说,FileUtil.getParent(path, 1) 返回的是基于 classpath 的地址(我这是 D:\Code\Java\Spring\zfile\target\classes\zfile-v4\db)而不是 D:\Code\Java\Spring\zfile\zfile-v4\db。导致了 db 文件创建到不应该的地方。这里附上 hutool 官方解释的 issue 链接:issue2559。同时附上 debug 的图:

我的理解:修改配置文件后,使用相对路径创建的 sqlite.db 应该是在 jar 包同级目录,而不是走的 classpath。导致使用相对路径后,出现了带 ! 的文件夹,如图

解决:不使用 hutool 的 FileUtil.getParent 函数,使用原生的 File 来新建多级路径。目前我改成如下,默认参数的路径和相对路径均测试通过。

public void init() { if (StrUtil.equals(datasourceDriveClassName, "org.sqlite.JDBC")) { String path = datasourceUrl.replace("jdbc:sqlite:", ""); String folderPath = FileUtil.getAbsolutePath(new File(path).getParentFile()); log.info("SQLite 数据库文件所在目录: [{}]", folderPath); File file = new File(folderPath); if (!file.exists()) { log.info("检测到 SQLite 数据库文件所在目录不存在, 已自动创建."); if (!file.mkdirs()) { log.error("SQLite 数据库文件创建失败."); } } else { log.info("检测到 SQLite 数据库文件所在目录已存在, 无需自动创建."); } } }

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you are subscribed to this thread.Message ID: @.***>

zhaojun1998 avatar Jul 26 '23 22:07 zhaojun1998