2013-10-02 4 views
2

Я пишу приложение для Windows Store. Я должен воссоздать базу данных в некоторых случаях (тесты, новый пользователь и т. Д.) - используется Sqlite. Мне нужно скопировать существующую базу данных в резервную копию, удалить существующую базу данных и затем создать новый файл базы данных со схемой.Не удается удалить файл в приложении Windows Store. Доступ запрещен. (HRESULT: 0x80070005 (E_ACCESSDENIED))

Код:

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() два раза последовательно, файл базы данных будет создан при первом обращении и UnauthorizedAccessException будут выброшены во время его удаления во время второго вызова - см комментарий , Я не знаю, что может держать этот файл открытым. См., Что я null ссылку на SQliteAsyncConnetion и заставить коллекцию всех поколений. Тем не менее, я не могу удалить файл - {«Доступ запрещен». (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)) »}.

Файл создается в ApplicationData.Current.LocalFolder.Path.

В настоящее время я пытаюсь воссоздать db во время каждого теста интеграции.

ответ

4

Проблема заключается в том, что SQLiteAsyncConnection реализует пул соединений - пул имеет побочный эффект при открытии файла db.

Единственное решение, которое я вижу, - использовать синхронную версию API. Нет пула, и он позволяет закрыть соединение db и, следовательно, закрыть файл:

private bool CreateSchema() 
{ 
    using (var db = new SQLiteConnection(DbConstants.DbFileWithPath)) 
    { 
     db.CreateTables(typeof (Doc), typeof(DocAttachment)); 
    } 
    return true; 
} 
Смежные вопросы