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[] 而是使用 IBufferMemoryStream.

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