zfile-dev / zfile

在线云盘、网盘、OneDrive、云存储、私有云、对象存储、h5ai、上传、下载
https://www.zfile.vip
MIT License
9.59k stars 1.83k forks source link

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

Open sleepybear1113 opened 1 year ago

sleepybear1113 commented 1 year ago

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

zhaojun1998 commented 1 year ago

下版本修复

---原始邮件--- 发件人: @.> 发送时间: 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: @.***>