2017-05-13 12 views
0

UWPを使用してラズベリーパイにLiteDbを使用してデータベースプロバイダを実装しようとしています。外部ハードドライブが接続されており、サポートされているより大きなデータベースサイズを持つために、特定の「データベース」ドライブとして使用したいと思っています。StorageFile引数を使用してLiteDbデータベースを作成する

私はStorageFileを渡しています。それは、その後、私のデータベースファイルとして使用されます。 LiteDbの1つのコンストラクタはストリーム(System.IO.Stream)を使用しますが、System.IO.Streamから派生したStorageFileオブジェクトをストリームに変換して新しいwin10セキュリティ制限(従来のFileを防ぐなど、ユーザーアクセス権を必要とします。アプリケーションデータディレクトリ以外への書き込み/パスベースのアクセス)。

は本当にこだわっています、両方の読み取りおよびStorageFileへの書き込みアクセス権を与え、私が試してみましたオプションは、次のとおりです。残念ながら

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

、私はへの読み取り/書き込みアクセスの両方を与える任意の他の方法を見つけることができませんファイルをストリームとして出力します。

うまくいけば、ここにいる人には回避策があります。

答えて

1

...あなたが読むために書き込み用StorageFile.OpenAsync(FileAccessMode.ReadWrite)StorageFile.OpenAsync(FileAccessMode.Read)を使用することができます...ストリームに

をStorageFileオブジェクトを変換するために、とにかくそこにあります。

win10のセキュリティ制限については

( エリアなどにアクセスするためのユーザー権限を必要とする、あなたのアプリケーションデータディレクトリ以外の ものに伝統的なFile.Write /パスベースのアクセスを防止します)。

あなたはPublisherCacheFolderを利用することができます

Windowsランタイムアプリケーションの強力なセキュリティモデルは、一般的にそれらの間でデータを共有することから のアプリを防ぎます。ただし、ユーザーごとに のファイルと設定を共有する場合は、同じパブリッシャーのアプリの場合は を使用すると便利です。アプリパブリッシャーは、 にアプリを登録すると、アプリマニフェストに 個の拡張機能を追加して公開する他のアプリとストレージフォルダを共有できます。あなたはIRandomAccessStreamこのようなSystem.IO.Streamに変換することができます

あなたが参照できる次のコードピース:

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

更新

Stream writeStream = destinationStream.AsStreamForWrite(); 

Stream readStream = sourceStream.AsStreamForRead(); 
+0

こんにちは、応答に感謝、ストリームの作成に関しては、OpenAsyncによって返されたストリーム残念ながら、 'IAsyncOperation '型です。コンストラクタがサポートするSystem.IO.Streamと互換性がありません。'PublisherCacheFolder'情報、つまりフォルダパスを指定する方法を見ると、外部ドライブへの全パスを渡すことができるかどうかを示す情報はオンラインで見つけることができません。それはxmlの設定で 'D:\ folder'を使うことで可能ですか?ご協力いただきありがとうございます! –

+0

'KnownFolders.RemovableDevices'を使用して外部ドライブを取得できます。 –

+0

はい私はリムーバブルドライブ用のストレージファイルオブジェクトを既に持っていますが、アクセスを禁止すると思われるパスではなく、外部ドライブをデータベースディレクトリとして使用するストリームが必要です。 –

関連する問題