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 命名空间,因此它也应该适用于 Windows 8。

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 回答