C# 安卓设备断电后,本地存档文件为空的问题

环境:Unity Android 9 C#

需求

实时存储数据,数据一直变动,就需要一直存

原因

安卓系统文件存储(File类)并不会直接存到磁盘里,而是有一个缓存区,缓存区在内存里,安卓系统认为是时候把缓存的数据存到磁盘里了,你才真正意义上保存完毕了。(Windows好像也是这样)
如果还没有存到磁盘里就断电了,那数据就没了。

Java可以手动清除缓存区,强制存到磁盘里。奈何我不会这个- -

不同设备好像需要不同适配,不是很确定。

纯C#的解决办法

根据需求,我开了一个线程
每0.1秒存储一个新的文件,文件名称格式:00000-000000。
前面五位数字是天数,后面的6位数字是序号,一天86400秒,最多就是864000个文件
后面每到864000,就归0,前面的天数+1,最大99999天可以支持程序运行273年。
超过还有天数归0功能,直接无敌
设置一个文件最大数量,300个,当超过这个数量时,删除最早存的那个。(好在我的文件只有1kb大小。)

在读取文件时获取名称的数值,并从最大数值的文件开始读取,直到读取到正确数据为止。

我使用的安卓盒子测试缓存时间,大概8~10秒才会存到磁盘里(简单测试,仅供参考,建议自己测一下)

另外安卓盒子断电后,系统时间会重置到上次开机的时间

在断电重启后,读取“未来时间”的存档文件会失败,把系统时间调整到文件时间之后正常。

盒子没联网,也就没法通过网络更新时间,所以在文件存储的时候把文件的时间修改掉,解决问题。

File.SetCreationTime("C:\\test.txt", DateTime.Now.AddYears(-1));
File.SetLastWriteTime("C:\\test.txt", DateTime.Now.AddYears(-2));
File.SetLastAccessTime("C:\\test.txt", DateTime.Now.AddYears(-3));

SetCreationTime 修改文件的创建时间
SetLastWriteTime 修改文件的修改时间
SetLastAccessTime 修改文件的访问时间
AddYears(-1)代表减一年。
File的命名空间:System.IO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值