UWP может записывать файлы разных типов в папке Downloads, но не может делать то же самое для файла db SQLite. - PullRequest
0 голосов
/ 25 октября 2019

Среда : Microsoft.Data.Sqlite.Core , SQLitePCLRaw.bundle_winsqlite3 2.0.1 , Windows-10, VS2019- ver16.3.6

Следующий код работает в моем приложении UWP для создания файла в папке Downloads в папке Windows 10, а также для записи в этот файл. Но, как показано в second code block ниже, когда я делаю то же самое, создавая SQLite файл, скажем, sqliteSample.db в папке Downloads, а затем пытаюсь открыть эту базу данных, она выдает мне ошибку, показанную ниже:

Следующий фрагмент кода работает для создания и записи файла в папке Downloads :

StorageFile file = await Windows.Storage.DownloadsFolder.CreateFileAsync("sample.txt");

Windows.Storage.Pickers.FolderPicker folderPicker = new Windows.Storage.Pickers.FolderPicker
{
    SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Downloads
};
folderPicker.FileTypeFilter.Add(".txt");

StorageFolder oPickedFolder = await folderPicker.PickSingleFolderAsync();
if (oPickedFolder != null)
{
    //Application now has read/write access to all contents in the picked folder (including other sub-folder contents)
    Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.AddOrReplace("PickedFolderToken", oPickedFolder);
    string sSQLDbPath = Path.Combine(oPickedFolder.Path, "sample.txt");
    Windows.Storage.StorageFile sampleFile = await oPickedFolder.GetFileAsync("sample.txt");
    await Windows.Storage.FileIO.WriteTextAsync(sampleFile, "Swift as a shadow");
}

Следующий фрагмент кода успешно создает файл sqliteSample.db в Downloadsпапка, но выдает ошибку, показанную ниже при попытке открыть ее :

Примечания : В строке db.Open(); следующего кода возникает ошибка ниже. В режиме отладки в VS2019 я проверил, что переменная sSQLDbPath имеет правильный путь, и когда я вручную копирую / вставляю этот путь в проводник Windows, я вижу файл sqliteSample.db в той же подпапкеПапка загрузок, в которой также есть файл sample.txt, созданный из приведенного выше кода и работающий без ошибок.

Ошибка SQLite 14: «невозможно открыть файл базы данных».

StorageFile file = await Windows.Storage.DownloadsFolder.CreateFileAsync("sqliteSample.db");

Windows.Storage.Pickers.FolderPicker folderPicker = new Windows.Storage.Pickers.FolderPicker
{
    SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Downloads
};
folderPicker.FileTypeFilter.Add(".db");

StorageFolder oPickedFolder = await folderPicker.PickSingleFolderAsync();
if (oPickedFolder != null)
{
    //Application now has read/write access to all contents in the picked folder (including other sub-folder contents)
    Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.AddOrReplace("PickedFolderToken", oPickedFolder);

string sSQLDbPath = Path.Combine(oPickedFolder.Path, "sqliteSample.db");
using (SqliteConnection db = new SqliteConnection($"Filename={sSQLDbPath}"))
{
    db.Open();

    String tableCommand = "CREATE TABLE IF NOT " +
        "EXISTS MyTable (Primary_Key INTEGER PRIMARY KEY, " +
        "Text_Entry NVARCHAR(2048) NULL)";

    SqliteCommand createTable = new SqliteCommand(tableCommand, db);

    createTable.ExecuteReader();

}
}

С Права доступа к файлам и папкам в папке «Загрузки» :

Пользователь может предоставить другому приложению доступ к вашему файлу, выбрав файл изсредство выбора файлов. Ваше приложение также может использовать средство выбора файлов, чтобы получить доступ к файлам в папке «Загрузки», которые оно не создавало.

Возможности не нужны для создания или доступа к файлам в папке Downloads.

ПРИМЕЧАНИЕ : Этот пост также не помог.

1 Ответ

0 голосов
/ 25 октября 2019

Короткая история: SQLite не может видеть папку загрузок. Он может выполнять запись только в базы данных в папках ApplicationData приложения.

Более подробное объяснение: Ваше приложение имеет полный доступ только в нескольких местах (т. Е. Только для чтения в свою папку установки и для чтения и записи в данные своего приложения). Другие местоположения (библиотеки, предоставляемые через возможности, выбранные файлы или папки, каталог загрузок) получают доступ от файлового брокера. Приложение использует этот доступ с помощью функций, соответствующих модели безопасности приложения UWP, таких как классы Windows.Storage (как показано в вашем рабочем коде для создания базы данных) и CreateFileFromApp .

SQLite'sРеализация по умолчанию не использует ни один из этих методов, использующих доступ к файлу с посредниками, поэтому ApplicationData является единственным местом для чтения и записи, которое стандартная реализация SQLite может использовать без изменений. Вы можете предоставить доступ к приложению в другом месте (например, с возможностью broadFileSystemAccess), но SQLite по умолчанию не использует правильный API, чтобы использовать этот доступ.

Теоретически вы можете изменить SQLite для использования этих API (возможно, в виртуальной файловой системе SQLite), но я не знаю каких-либо реальных реализаций, которые это сделали.

...