我正在编写一个 Windows 应用商店应用程序。在某些情况下(测试、新用户等)我必须重新创建数据库 - 正在使用 Sqlite。我需要复制现有数据库进行备份,删除现有数据库,然后使用架构创建一个新的数据库文件。
代码:
public async Task<bool> CreateDatabaseAsync()
{
if (await PathUtils.FileExistsAsync(DbConstants.DbFileWithPath))
{
var currentDbFolder = await StorageFolder.GetFolderFromPathAsync(DbConstants.DbPath);
var currentdbFile = await StorageFile.GetFileFromPathAsync(DbConstants.DbFileWithPath);
await currentdbFile.CopyAsync(currentDbFolder, DbConstants.DbBackup, NameCollisionOption.ReplaceExisting);
//problem here with deletion
await currentdbFile.DeleteAsync(DbConstants.FilelDeletionOption);
}
return await CreateSchema();
}
private async Task<bool> CreateSchema()
{
var db = new SQLiteAsyncConnection(DbConstants.DbFileWithPath);
await db.CreateTablesAsync(typeof (Doc), typeof(DocAttachment));
db = null;
GC.Collect();
return true;
}
}
如果我连续调用方法 CreateDatabaseAsync() 两次,则将在第一次调用期间创建 db 文件,并在第二次调用期间删除该文件时抛出 UnauthorizedAccessException - 请参阅评论。我不知道什么可以让这个文件保持打开状态。请注意,我对 SQliteAsyncConnetion 的引用为空,并强制收集所有代。尽管如此,我仍无法删除该文件 - {“访问被拒绝。(HRESULT 异常:0x80070005 (E_ACCESSDENIED))”}。
正在 ApplicationData.Current.LocalFolder.Path 中创建文件。
目前我正在尝试在每个集成测试期间重新创建数据库。
最佳答案
问题在于 SQLiteAsyncConnection
实现了一个连接池 - 该池具有保持数据库文件打开的副作用。
我能看到的唯一解决方案是使用 API 的同步版本。没有池,它允许您关闭数据库连接,从而关闭文件:
private bool CreateSchema()
{
using (var db = new SQLiteConnection(DbConstants.DbFileWithPath))
{
db.CreateTables(typeof (Doc), typeof(DocAttachment));
}
return true;
}
关于c# - 无法删除 Windows 应用商店应用程序中的文件 - 访问被拒绝。 (HRESULT : 0x80070005 (E_ACCESSDENIED)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19135486/