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

时间:2013-10-02 11:05:38

标签: 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中创建文件。

目前我正在尝试在每次集成测试期间重新创建数据库。

1 个答案:

答案 0 :(得分:4)

问题是SQLiteAsyncConnection实现了连接池 - 池的副作用是保持db文件打开。

我能看到的唯一解决方案是使用API​​的同步版本。没有池,它允许您关闭数据库连接,因此关闭文件:

private bool CreateSchema()
{
    using (var db = new SQLiteConnection(DbConstants.DbFileWithPath))
    {
        db.CreateTables(typeof (Doc), typeof(DocAttachment));
    }
    return true;
}