使用StorageFile参数创建LiteDb数据库

时间:2017-05-13 20:00:39

标签: c# uwp windowsiot litedb

我正在尝试使用UWP在我的覆盆子pi上使用LiteDb实现数据库提供程序。它有一个外置硬盘驱动器,我非常希望将它作为一个特定的"数据库"驱动器,允许我拥有更大的支持数据库大小。

我正在传递StorageFile,然后将其用作我的数据库文件。 LiteDb上的一个构造函数使用流(System.IO.Stream),无论如何都要将StorageFile对象转换为流(从System.IO.Stream派生)以实现新的win10安全限制(需要用户访问区域等的权限,阻止传统的基于File.Write / path的访问除应用程序数据目录以外的任何内容。)

真的卡住了,我试过的选项,它给StorageFile的读写访问权限是:

var stream = storageProvider.StorageLocaton.OpenAsync(FileAccessMode.ReadWrite);

不幸的是,我找不到任何其他方法可以将文件的读/写访问权作为流。

希望有人在这里有解决方案。

1 个答案:

答案 0 :(得分:1)

  

...无论如何都要将StorageFile对象转换为流...

您可以使用StorageFile.OpenAsync(FileAccessMode.ReadWrite)进行撰写,使用StorageFile.OpenAsync(FileAccessMode.Read)进行阅读。

至于

  

win10安全限制(要求用户访问权限)   区域等,阻止传统的基于File.Write / path的访问   除应用程序数据目录之外的任何其他内容。)

您可以使用PublisherCacheFolder

  

Windows运行时应用程序的强大安全模型通常会阻止   应用程序之间共享数据。但是,它可能很有用   对于来自同一发布者的应用程序,以共享文件和设置   每个用户的基础。作为应用发布商,您可以注册您的应用   与您通过添加发布的其他应用共享存储文件夹   应用清单的扩展。

您可以参考以下代码:

        StorageFolder sharedFonts = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("test");
        var testFile = await sharedFonts.CreateFileAsync("test.txt", CreationCollisionOption.OpenIfExists);

        var byteArray = new byte[] { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a };
        using (var sourceStream = new MemoryStream(byteArray).AsRandomAccessStream())
        {
            using (var destinationStream = (await testFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0))
            {
                await RandomAccessStream.CopyAndCloseAsync(sourceStream, destinationStream);
            }
        }

        var readArray = new byte[100];
        using (var destinationStream = new MemoryStream(readArray).AsRandomAccessStream())
        {
            using (var sourceStream = (await testFile.OpenAsync(FileAccessMode.Read)).GetInputStreamAt(0))
            {
                await RandomAccessStream.CopyAndCloseAsync(sourceStream, destinationStream);
            }
        }

<强>更新

您可以将IRandomAccessStream转换为System.IO.Stream,如下所示:

Stream writeStream = destinationStream.AsStreamForWrite();

Stream readStream = sourceStream.AsStreamForRead();