You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用Kotlin文件写入后,Synology Drive同步引发文件冲突问题

Synology Drive同步时文件覆盖写入引发冲突的解决方法

问题根源

你遇到的冲突是因为Synology Drive的同步机制会通过文件的修改时间、内容哈希或操作时序判断是否存在“两端同时修改”的情况。当用printWriter()或bufferedWriter()直接覆盖写入文件时,这个过程会被同步工具捕捉为“文件先被清空/修改,随后电脑端又传来修改版本”,从而触发冲突重命名逻辑,生成带_Conflict后缀的文件。

解决方案

1. 原子写入:先写临时文件再替换原文件

这种方式让同步工具只感知到一次文件替换操作,避免中间状态被误判。代码实现如下:

fun saveControl(controlesProduct: ControlesProduct, newLoc: String = "") {
    val targetFile = File(controlesProduct.path)
    val tempFile = File(targetFile.parent, "${targetFile.name}.tmp")

    // 使用use自动关闭流,避免资源泄漏
    tempFile.printWriter().use { writer ->
        writer.write("test")
    }

    // 原子替换原文件
    if (tempFile.exists()) {
        targetFile.takeIf { it.exists() }?.delete()
        tempFile.renameTo(targetFile)
    }
}

2. 使用Java NIO的原子写入API

Java NIO的Files.write方法支持原子替换选项,能更高效完成覆盖写入,减少同步工具误判概率:

import java.nio.file.Files
import java.nio.file.Paths
import java.nio.file.StandardOpenOption

fun saveControl(controlesProduct: ControlesProduct, newLoc: String = "") {
    val content = "test".toByteArray()
    val filePath = Paths.get(controlesProduct.path)
    
    // CREATE:文件不存在则创建;REPLACE_EXISTING:存在则替换;WRITE:写入权限
    Files.write(
        filePath,
        content,
        StandardOpenOption.CREATE,
        StandardOpenOption.REPLACE_EXISTING,
        StandardOpenOption.WRITE
    )
}

3. 调整Synology Drive同步策略

如果代码调整后仍有问题,可以在Synology Drive客户端设置中修改冲突解决规则:将冲突处理从“创建冲突文件”改为“保留最新版本”。不过这个设置会作用于所有同步文件,需根据实际需求调整。

注意事项

  • Android 10及以上版本,若操作外部存储目录,需申请MANAGE_EXTERNAL_STORAGE权限,或确保文件位于应用可访问的共享目录中。
  • 测试时确保同步工具处于正常运行状态,避免缓存导致的异常。

内容的提问来源于stack exchange,提问作者Jarne Rius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:48:23