8

現在、カメラから取得したjpeg画像を含むストリームをローカルストレージフォルダに保存しようとしています。ファイルは作成中ですが、残念ながらデータがまったく含まれていません。これが私が使おうとしているコードです:

public async Task SaveToLocalFolderAsync(Stream file, string fileName)
{
  StorageFolder localFolder = ApplicationData.Current.LocalFolder;
  StorageFile storageFile = await localFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);

  using (IRandomAccessStream fileStream = await storageFile.OpenAsync(FileAccessMode.ReadWrite))
  {
    using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0))
    {
      using (DataWriter dataWriter = new DataWriter(outputStream))
      {
        dataWriter.WriteBytes(UsefulOperations.StreamToBytes(file));
        await dataWriter.StoreAsync();
        dataWriter.DetachStream();
      }
      await outputStream.FlushAsync();
    }
  }
}

public static class UsefulOperations
{
  public static byte[] StreamToBytes(Stream input)
  {
    using (MemoryStream ms = new MemoryStream())
    {
      input.CopyTo(ms);
      return ms.ToArray();
    }
  } 
}

この方法でファイルを保存するのに役立つ情報は大歓迎です。オンラインで見つけたすべてのヘルプは、テキストの保存を参照しています。Windows.Storage名前空間を使用しているので、Windows8でも動作するはずです。

4

1 に答える 1

26

あなたの方法SaveToLocalFolderAsyncはうまく機能しています。渡したものを試してみたところStream、期待通りに内容が完全にコピーされていました。

メソッドに渡すストリームの状態に問題があると思います。たぶん、あなたはその位置を前もって。で最初に設定する必要があるだけですfile.Seek(0, SeekOrigin.Begin);。それでも問題が解決しない場合は、そのコードを質問に追加してください。サポートさせていただきます。

また、コードをはるかに単純にすることもできます。以下は、中間クラスがなくてもまったく同じことを行います。

public async Task SaveToLocalFolderAsync(Stream file, string fileName)
{
    StorageFolder localFolder = ApplicationData.Current.LocalFolder;
    StorageFile storageFile = await localFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
    using (Stream outputStream = await storageFile.OpenStreamForWriteAsync())
    {
        await file.CopyToAsync(outputStream);
    }
}
于 2013-02-01T06:09:10.373 に答える