c# - 无法删除 Windows 应用商店应用程序中的文件 - 访问被拒绝。 (HRESULT : 0x80070005 (E_ACCESSDENIED))

标签 c# sqlite file-io windows-store-apps sqlite-net

我正在编写一个 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/

相关文章:

java - 我应该在哪里放置 close() 方法?

java - 如何将 TXT 文件加载到 JList 中?

c++ - C/C++ : Conversion of char[] to int fails, unsigned char[] to int 有效,为什么?

c# - 使用具有父子关系 VB 或 C# 的 Web 服务

C# DataGridView 列顺序

mysql - 获取起始日期和截止日期内的年份数据

c - 如何使用来自另一个系统的 c/Objective C 和 FTP/SSH 连接、打开、添加到系统上的 sqlite 数据库

database - 嵌入式数据库的选择?

c# - .NET 3.5 : anonymous delegate for handlers with ref params

c# - 这种使用静态队列线程安全吗?