linux - 将 SQLite 数据库复制到另一个路径

标签 linux sqlite

我正在临时文件夹中创建一个 sqlite 数据库。现在我想将该文件复制到另一个文件夹。有没有sqlite命令可以重命名sqlite数据库文件?

我尝试在 C++ 中使用重命名函数,但它返回错误 18。错误 18 表示:“包含名称 newname 的目录必须与文件位于同一文件系统上(如名称 oldname 所示)”。

有人可以建议更好的方法来做到这一点吗?

最佳答案

在正确的文件系统上使用临时目录!

首先,sqlite数据库只是一个文件。它可以移动或复制到您想要的任何位置,前提是:

  • 上次已正确关闭,因此日志中没有可回滚的内容
  • 如果它使用预写日志类型的日志,则它是完全检查点的。

因此将其作为文件移动是正确的。现在有两种方法可以移动文件:

  • 使用rename系统调用。
  • 复制文件并删除旧文件。

前者有很多优点:它不能留下部分写入的文件,不能留下两个文件,速度非常快,如果您使用它来重命名旧文件,则不会出现目标所在的时期name 将不存在(最后一个是 POSIX 语义,Windows 可以在 NTFS 上执行此操作,但不能在 FAT 文件系统上执行)。它还有一个重要的缺点:它只能在文件系统内工作。所以你必须:

  • 如果您要重命名它以确保在进程失败时不会留下部分写入的文件,则需要使用重命名,因此必须使用同一文件系统上的临时位置。通常这是通过在同一目录中使用不同的名称而不是使用临时目录来完成的。
  • 如果您因为目的地可能很慢而重命名它,例如因为您想将其放在网络共享上,所以显然您想在不同的文件系统上使用临时目录。这意味着您必须读取该文件并以新名称写入。标准 C 或 C++ 库中没有此功能,但许多库都会有一个(像 python 这样的高级语言也会有一个,你总是可以只执行 /bin/mv 来完成给你)。

关于linux - 将 SQLite 数据库复制到另一个路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12275872/

相关文章:

sqlite - 使用 Azure 移动应用程序的 ionic 2 离线数据同步抛出 TypeError :Cannot read property 'openDatabase' of undefined

linux - 同步使用来自多个环境(Windows 和 Linux)的组件

python - 为 Linux 编写锁屏?

linux - 无法打开10000端口

Linux 上的 Asp.net 核心 - dotnet ef 数据库更新失败并出现版本错误

database - 轻量级客户端/服务器数据库?

node.js - 当我尝试安装 Node 包时出现 zlib 错误

Linux 上的 Java File.toURI() 问题

linux - 打破 Bash 中的嵌套函数循环

java - 我的 RecyclerView 中的 SQLite 数据没有被删除