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
相关产品推荐
相关产品推荐

