UWP:异步读取文件到 byte[]
UWP: async read file into byte[]
我想将本地存储的文件读入字节数组。我怎么做?这是我的尝试:
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 并修改您的方法:
第一个通过提供的缓冲区读取字节,尽管此方法需要 seekable 流:
FileOpenPicker picker = new FileOpenPicker();
picker.FileTypeFilter.Add(".txt");
using (Stream fileStr = await (await picker.PickSingleFileAsync()).OpenStreamForReadAsync())
{
byte[] bytes = new byte[fileStr.Length];
const int BUFFER_SIZE = 1024;
byte[] buffer = new byte[BUFFER_SIZE];
int position = 0;
int bytesread = 0;
while ((bytesread = await fileStr.ReadAsync(buffer, 0, BUFFER_SIZE)) > 0)
for (int i = 0; i < bytesread; i++, position++)
bytes[position] = buffer[i];
}
第二种方法是异步复制文件流到内存然后以数组形式获取:
using (MemoryStream memStream = new MemoryStream())
using (Stream fileStr = await (await picker.PickSingleFileAsync()).OpenStreamForReadAsync())
{
await fileStr.CopyToAsync(memStream);
byte[] bytes = memStream.ToArray();
}
你的方法几乎没有修改 - 通过内存流处理:
var buffer = await FileIO.ReadBufferAsync(file);
using (MemoryStream mstream = new MemoryStream())
{
await buffer.AsStream().CopyToAsync(mstream);
byte[] result = mstream.ToArray();
}
或者最好避免使用 byte[] 而是使用 IBuffer 或 MemoryStream.
StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile sampleFile = await storageFolder.GetFileAsync(FILE_NAME);
byte[] result;
using (Stream stream = await sampleFile.OpenStreamForReadAsync())
{
using (var memoryStream = new MemoryStream())
{
stream.CopyTo(memoryStream);
result = memoryStream.ToArray();
}
}
我认为其他答案使事情不必要地复杂化。为此,有一个方便的扩展方法IBuffer.ToArray()
。
只需这样做:
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Storage;
...
IStorageFile file;
IBuffer buffer = await FileIO.ReadBufferAsync(file);
byte[] bytes = buffer.ToArray();
我想将本地存储的文件读入字节数组。我怎么做?这是我的尝试:
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 并修改您的方法:
第一个通过提供的缓冲区读取字节,尽管此方法需要 seekable 流:
FileOpenPicker picker = new FileOpenPicker(); picker.FileTypeFilter.Add(".txt"); using (Stream fileStr = await (await picker.PickSingleFileAsync()).OpenStreamForReadAsync()) { byte[] bytes = new byte[fileStr.Length]; const int BUFFER_SIZE = 1024; byte[] buffer = new byte[BUFFER_SIZE]; int position = 0; int bytesread = 0; while ((bytesread = await fileStr.ReadAsync(buffer, 0, BUFFER_SIZE)) > 0) for (int i = 0; i < bytesread; i++, position++) bytes[position] = buffer[i]; }
第二种方法是异步复制文件流到内存然后以数组形式获取:
using (MemoryStream memStream = new MemoryStream()) using (Stream fileStr = await (await picker.PickSingleFileAsync()).OpenStreamForReadAsync()) { await fileStr.CopyToAsync(memStream); byte[] bytes = memStream.ToArray(); }
你的方法几乎没有修改 - 通过内存流处理:
var buffer = await FileIO.ReadBufferAsync(file); using (MemoryStream mstream = new MemoryStream()) { await buffer.AsStream().CopyToAsync(mstream); byte[] result = mstream.ToArray(); }
或者最好避免使用 byte[] 而是使用 IBuffer 或 MemoryStream.
StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile sampleFile = await storageFolder.GetFileAsync(FILE_NAME);
byte[] result;
using (Stream stream = await sampleFile.OpenStreamForReadAsync())
{
using (var memoryStream = new MemoryStream())
{
stream.CopyTo(memoryStream);
result = memoryStream.ToArray();
}
}
我认为其他答案使事情不必要地复杂化。为此,有一个方便的扩展方法IBuffer.ToArray()
。
只需这样做:
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Storage;
...
IStorageFile file;
IBuffer buffer = await FileIO.ReadBufferAsync(file);
byte[] bytes = buffer.ToArray();