C# UWP:将文件异步读取到字节[]

C# UWP:将文件异步读取到字节[],c#,windows-phone,win-universal-app,windows-10-mobile,C#,Windows Phone,Win Universal App,Windows 10 Mobile,我想将本地存储的文件读入字节数组。我该怎么做?这是我的尝试: StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(filePath); var file = await folder.GetFileAsync(filePath); var buffer = await FileIO.ReadBufferAsync(file); DataReader dataReader = Windows.Storage.Strea

我想将本地存储的文件读入字节数组。我该怎么做?这是我的尝试:

StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(filePath);
var file = await folder.GetFileAsync(filePath);
var buffer = await FileIO.ReadBufferAsync(file);
DataReader dataReader = Windows.Storage.Streams.DataReader.FromBuffer(buffer);
// doesn't work because ReadBytes wants a byte[] as parameter and also isn't asynchronous
byte[] result = dataReader.ReadBytes(buffer.Length);

我想到了三个概念—使用FileStream和修改您的方法:

  • 第一个方法通过提供的缓冲区读取字节,但此方法需要可查找的流:

    FileOpenPicker-picker=newfileopenpicker();
    picker.FileTypeFilter.Add(“.txt”);
    使用(Stream fileStr=await(await picker.PickSingleFileAsync()).OpenStreamForReadAsync())
    {
    byte[]bytes=新字节[fileStr.Length];
    const int BUFFER_SIZE=1024;
    字节[]缓冲区=新字节[缓冲区大小];
    int位置=0;
    int字节读取=0;
    而((bytesread=await fileStr.ReadAsync(缓冲区,0,缓冲区大小))>0)
    对于(int i=0;i
  • 第二个方法将filestream异步复制到内存,然后将其作为数组获取:

    使用(MemoryStream memStream=new MemoryStream())
    使用(Stream fileStr=await(await picker.PickSingleFileAsync()).OpenStreamForReadAsync())
    {
    等待文件tr.CopyToAsync(memStream);
    byte[]bytes=memStream.ToArray();
    }
    
  • 您的方法几乎没有MDI-通过内存流进行处理:

    var buffer=await FileIO.ReadBufferAsync(文件);
    使用(MemoryStream mstream=new MemoryStream())
    {
    等待buffer.AsStream().CopyToAsync(mstream);
    字节[]结果=mstream.ToArray();
    }
    

或者最好不要使用byte[],而是使用IBuffer或MemoryStream。

我认为其他答案会使事情变得不必要的复杂。为此,有一种方便的扩展方法
IBuffer.ToArray()

只需这样做:

using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Storage;
...
IStorageFile file;
IBuffer buffer = await FileIO.ReadBufferAsync(file);
byte[] bytes = buffer.ToArray();

提到我应该使用
DataReader
。这并不意味着有什么不同。因此,我想要一个
字节[]
。如何将缓冲区转换为字节[]?你说得对,我又被绊倒了。我发现新API的命名有时令人困惑。@HenkHolterman:用于将缓冲区转换为我找到的字节[]。尚未尝试。对复制操作使用
CopyToAsync()
是否更好?IBuffer buffer=FileIO.ReadBufferAsync(文件);需要等待,ToArray()方法在哪里?没错,我已经添加了等待。关于ToArray(),它是System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions中定义的扩展方法,这就是我在示例中导入该命名空间的原因。嘿@Romasz,是什么驱使你使用这些方法中的一种而不是另一种呢?@AdrianK事实上,我会避免使用数组,而选择流。选择方法还取决于平台、预测的文件大小及其用途。
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Storage;
...
IStorageFile file;
IBuffer buffer = await FileIO.ReadBufferAsync(file);
byte[] bytes = buffer.ToArray();