Открытие SQLite-соединения в UWP сразу после перемещения StorageFile

Пролог:

Я пишу клиент с графическим интерфейсом SQLite для UWP. я использую Microsoft.Data.Sqliteбиблиотека для SQLite API с C #. Также я использую таблицу перенаправления, чтобы иметь возможность открывать базу данных в моем приложении-песочнице, которое опубликовано в Microsoft Store. Таблица перенаправления заменяет CreateFileW к CreateFileFromAppW звонки и тому подобное.

Проблема:

Пользователь имеет File -> Save asхарактерная черта. Когда пользователь создает новый файл базы данных, он создается внутри локального каталога приложения. Затем, когда пользователь сохраняет свою базу данных, так как мне нужно переместить этот файл. я использую StorageFileПричина API, что я не могу использовать какой-либо другой файловый API в приложении-песочнице. Поэтому я звоню:

      var savePicker = new Windows.Storage.Pickers.FileSavePicker();
savePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary;
savePicker.FileTypeChoices.Add("SQLite3 Database", new List<string>() { ".sqlite", ".db" });
savePicker.SuggestedFileName = "Database";
var file = await savePicker.PickSaveFileAsync();
if(null != file)
{                    
    Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.Add(file);
    sqliteConnection.Close();  // it is important cause if I skip this moving a file will fail
    var localFolder = ApplicationData.Current.LocalFolder;
    var currentStorageFile = await localFolder.GetFileAsync(App.UnsavedDatabaseFileName);  // here I obtain StorageFile for opened database
    await currentStorageFile.MoveAndReplaceAsync(file);  // here I move a file
    sqliteConnection = new SqliteConnection("Data Source=" + file.Path);
    sqliteConnection.Open();  // this line fails with error 14: cannot open database file
}            

Я также попытался пропустить закрытие и повторное открытие соединения -> затем перемещение файла не удалось. Если я позвоню между await currentStorageFile.MoveAndReplaceAsync(file); а также sqliteConnection = new SqliteConnection("Data Source=" + file.Path);тогда все будет работать нормально, но отображение средства выбора открытия файла сразу после средства выбора сохранения файла - очень плохой пользовательский интерфейс. Я знаю, что изолированное приложение дает разрешение на доступ к файлу только после того, как пользователь выбрал файл вручную. Но похоже на то FileSavePicker не дает мне разрешения так же, как FileOpenPickerделает. Я не смог найти никакой информации об этом.

Эпилог:

Это приложение https://sqliteman.dev . Не стесняйтесь критиковать, потому что это то, что делает мое приложение лучше.

3 ответа

Приложение Uwp может использовать возможность broadFileSystemAccess. Эта возможность позволяет приложениям получать тот же доступ к файловой системе, что и пользователь, который в настоящее время запускает приложение, без каких-либо дополнительных запросов стиля выбора файлов во время выполнения, что работает для API-интерфейсов Windows.Storage.

Если вы хотите его использовать, вам нужно добавить его в Package.appxmanifest, как показано ниже. Кроме того, вам необходимо предоставить разрешение в приложении « Настройки» для этого приложения uwp, доступ можно настроить в « Настройки»> «Конфиденциальность»> «Файловая система».

      <Package
  ...
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap mp rescap">
...
<Capabilities>
    <rescap:Capability Name="broadFileSystemAccess" />
</Capabilities>

Попробуйте поставить MoveAndReplaceAsync() в операторе using и открывая соединение SQLite за его пределами.

Если это проблема с разрешениями, то одним из решений может быть объявление broadFileSystemAccess в манифесте вашего приложения.

https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions

Мне кажется странным, что у вас нет доступа на запись к создаваемому вами файлу.

Другие вопросы по тегам