public IActionResult OnPostBf()
{
var db = App.GetService<SqlSugar.ISqlSugarClient>(); var connStr = db.CurrentConnectionConfig.ConnectionString; var builder = new SqliteConnectionStringBuilder(connStr); // 原数据库
var dbFile = builder.DataSource; //数据库名称
var dbName = Path.GetFileName(dbFile); // 数据库密码
var password = builder.Password; var dbFullPath = Path.Combine(
App.WebHostEnvironment.ContentRootPath, dbFile.Replace('/', Path.DirectorySeparatorChar)); // 备份文件
var backupDir = Path.Combine(
App.WebHostEnvironment.ContentRootPath, "App_Data", "Backup"); Directory.CreateDirectory(backupDir); var backupFile = Path.Combine(
backupDir, $"{Path.GetFileNameWithoutExtension(dbName)}_{DateTime.Now:yyyyMMddHHmmss}.db"); // 源数据库
var sourceBuilder = new SqliteConnectionStringBuilder()
{
DataSource = dbFullPath,
Password = password,
Mode = SqliteOpenMode.ReadWrite,
Cache = SqliteCacheMode.Shared }; // 目标数据库
var destBuilder = new SqliteConnectionStringBuilder()
{
DataSource = backupFile,
Password = password
}; // 创建备份
using (var source = new SqliteConnection(sourceBuilder.ConnectionString))
using (var dest = new SqliteConnection(destBuilder.ConnectionString))
{
source.Open(); dest.Open(); source.BackupDatabase(dest); // 强制关闭连接
dest.Close(); source.Close(); }
// 清理 SQLite 连接池
SqliteConnection.ClearAllPools(); // 等待 Windows 释放文件锁
GC.Collect(); GC.WaitForPendingFinalizers(); // 给 SQLCipher 一点释放时间
System.Threading.Thread.Sleep(500); // 下载
var fileStream = new FileStream(
backupFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, bufferSize: 1024 * 64, useAsync: true); return File(
fileStream, "application/octet-stream", Path.GetFileName(backupFile)); }