1

我正在尝试使用 UWP 在我的树莓派上使用 LiteDb 实现数据库提供程序。它连接了一个外部硬盘驱动器,我非常想将它用作特定的“数据库”驱动器,以允许我拥有更大的受支持数据库大小。

我被传递了一个StorageFile,然后将其用作我的数据库文件。LiteDb 上的一个构造函数使用流 ( System.IO.Stream),是否有将StorageFile对象转换为流(派生自System.IO.Stream)以满足新的 win10 安全限制(需要用户权限访问区域等,防止传统的 File.Write/path基于对应用程序数据目录以外的任何内容的访问)。

真的被卡住了,我尝试过的选项StorageFile是:

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

不幸的是,我找不到任何其他方法可以同时对文件进行读/写访问作为流。

希望这里有人有解决方法/解决方案。

4

1 回答 1

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);
            }
        }

更新:

你可以转换IRandomAccessStreamSystem.IO.Stream这样:

Stream writeStream = destinationStream.AsStreamForWrite();

Stream readStream = sourceStream.AsStreamForRead();
于 2017-05-15T08:21:24.880 回答