关于Qt资源文件导致sqlite3文件变只读的问题

加盾男爵 2017-12-11 10:10:09
一个程序使用SQlite3数据库,其中有个功能是数据的恢复出厂设置,程序的目录下有个文件夹./dataFile,数据库文件就放在这个文件夹下,
然后在资源文件里有
<file>data/sourceData.db</file>

这个sourceData.db文件是初始数据,然后程序里如果用户选择了恢复出厂设置,就会执行类似下面的代码

QString oldFile = tr("E:/TFH/dataFile/sourceData.db");
QString newFile = tr(":/data/sourceData.db");
QFile fs;
fs.copy(oldFile,newFile); //直接赋值替换掉用户使用的数据库文件


然后问题来了,当用户再次修改数据库文件,数据库直接回复
"attempt to write a readonly database"

这数据库文件里的数据库变只读文件了,然后我试了下,把资源文件里的直接赋值过去,既关闭程序,然后直接把E:/TFH/sourceData.db这个文件赋值替换掉E:/TFH/dataFile/sourceData.db,程序再次运行一切正常,我想问下为什么这个数据库文件放入资源文件后复制下,里面的数据库就变成只读的了?
...全文
429 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Liuzwang 2017-12-11
  • 打赏
  • 举报
回复
楼主,我想了一下,复制文件应该是:copy一个file,然后粘贴到另一个目录下面。 你的代码的话,copy一个file,到另一个file上。 所以的话,QString newFile = tr(":/data/sourceData.db");改成QString newFile = tr(":/data/"); 试试吧,我感觉应该是这样。
加盾男爵 2017-12-11
  • 打赏
  • 举报
回复
引用 1 楼 Liuzwang 的回复:
你调用的好像是static静态函数啊, 正确姿势应该是QFile::copy(oldFile,newFile);但是这个能不能解决错误就不晓得了。
我下午又试了下,和copy()函数无关,问题出在资源文件上,如果数据库文件不嵌入资源文件而知放在硬盘上的某个位置,那复制过来的权限是没有问题的,但如果数据库文件嵌入资源文件,从资源文件上复制过来,那数据库文件里的数据库就变成只读了
Liuzwang 2017-12-11
  • 打赏
  • 举报
回复
你调用的好像是static静态函数啊, 正确姿势应该是QFile::copy(oldFile,newFile);但是这个能不能解决错误就不晓得了。

16,235

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧