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