From 4e72485366b6d00c85899adb30c4454d3e746f5b Mon Sep 17 00:00:00 2001 From: GetLogBy Date: Sun, 16 Aug 2026 15:14:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(sync):=20=E4=BF=AE=E5=A4=8D=E5=A2=9E?= =?UTF-8?q?=E9=87=8F=E5=90=8C=E6=AD=A5=E4=BA=91=E7=AB=AF=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E9=87=8D=E5=A4=8D=E5=8F=8A=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/AppWebDav.kt | 4 ++-- .../main/java/io/legado/app/help/sync/SyncClient.kt | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/AppWebDav.kt b/app/src/main/java/io/legado/app/help/AppWebDav.kt index 818624a929..3951ad4c27 100644 --- a/app/src/main/java/io/legado/app/help/AppWebDav.kt +++ b/app/src/main/java/io/legado/app/help/AppWebDav.kt @@ -52,11 +52,11 @@ object AppWebDav { val isJianGuoYun get() = rootWebDavUrl.startsWith(defaultWebDavUrl, true) - /** 增量同步根目录 */ + /** 增量同步根目录, 位于备份目录(rootWebDavUrl)下的 sync/ */ val syncRootUrl: String get() { val root = if (rootWebDavUrl.endsWith("/")) rootWebDavUrl else "$rootWebDavUrl/" - return "${root}legado/sync/" + return "${root}sync/" } init { diff --git a/app/src/main/java/io/legado/app/help/sync/SyncClient.kt b/app/src/main/java/io/legado/app/help/sync/SyncClient.kt index 68b9aa9853..ef48f3fdd4 100644 --- a/app/src/main/java/io/legado/app/help/sync/SyncClient.kt +++ b/app/src/main/java/io/legado/app/help/sync/SyncClient.kt @@ -45,6 +45,7 @@ object SyncClient { /** 确保所有云端目录存在 */ suspend fun ensureDirs() { + ensureDir(baseUrl) DataSyncType.values().forEach { type -> kotlin.runCatching { webDav(dirUrl(type)).makeAsDir() @@ -55,6 +56,17 @@ object SyncClient { } } + /** 逐级创建目录, 兼容不支持自动创建父目录的服务器 */ + private suspend fun ensureDir(url: String) { + val dav = webDav(url) + if (dav.exists()) return + val parent = url.trimEnd('/').substringBeforeLast('/', url) + "/" + if (parent != url && parent.contains("://")) { + ensureDir(parent) + } + dav.makeAsDir() + } + // ============================ push ============================ suspend fun pushBooks() { @@ -101,6 +113,7 @@ object SyncClient { /** 推送全部启用的类型 */ suspend fun pushAll() { + ensureDirs() SyncConfig.dataTypes.forEach { type -> when (type) { DataSyncType.BOOKS -> pushBooks()