【问题标题】:How to read all bytes of a file in winrt with ReadBufferAsync?如何使用 ReadBufferAsync 在 winrt 中读取文件的所有字节?
【发布时间】:2018-12-08 17:12:22
【问题描述】:

我有一个对象数组,每个对象都需要从二进制文件数据中加载自己。我创建了这些对象的数组,然后为每个对象调用一个 AsyncAction,开始读取其数据。麻烦的是,它们并没有完全加载——它们往往只从文件中获取部分数据。我怎样才能确保阅读全文?下面是代码的概要:首先我枚举文件夹内容以获取其中包含的每个文件的 StorageFile。然后,在一个 for 循环中,创建每个接收对象并传递下一个 StorageFile,并创建自己的 Buffer 和 DataReader 来处理读取。 m_file_bytes 是一个 std::vector。

m_buffer = co_await FileIO::ReadBufferAsync(nextFile);
  m_data_reader = winrt::Windows::Storage::Streams::DataReader::FromBuffer(m_buffer);
  m_file_bytes.resize(m_buffer.Length());
  m_data_reader.ReadBytes(m_file_bytes); 

我的想法是,由于缓冲区和读取器是对象的类成员,因此它们不会超出范围,并且可以在要求下一个对象将自己加载到单独的 AsyncAction 中时不间断地完成工作。但是 DataReader 只能获得一半或更少的文件数据。可以做些什么来确保它完成?感谢您提供任何见解。

[更新] 也许是文件系统一次只能处理一个读取任务,并且通过启动所有这些异步读取每个都中断前一个 -?但是必须有一种方法可以逐步读取一个装满文件的文件夹。

[更新] 我认为我可以通过采用同心循环的原理来实现它 - 这个想法是在第一个加载完成之前不要继续进行下一个加载。我认为 - 如果我错了,有人可以纠正我,文件系统不能同时读取。如果有一个公认且安全的示例说明如何执行此操作,我仍然很想听听,所以我不回答我自己的问题。

【问题讨论】:

    标签: c++-winrt


    【解决方案1】:
        #include <wrl.h>
        #include <robuffer.h>   
        uint8_t* GetBufferData(winrt::Windows::Storage::Streams::IBuffer& buffer)
        {
            ::IUnknown* unknown = winrt::get_unknown(buffer);
            ::Microsoft::WRL::ComPtr<::Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;
            HRESULT hr = unknown->QueryInterface(_uuidof(::Windows::Storage::Streams::IBufferByteAccess), &bufferByteAccess);
            if (FAILED(hr))
                return nullptr;
            byte* bytes = nullptr;
            bufferByteAccess->Buffer(&bytes);
            return bytes;
       }
    

    https://docs.microsoft.com/en-us/cpp/cppcx/obtaining-pointers-to-data-buffers-c-cx?view=vs-2017

    https://docs.microsoft.com/en-us/windows/uwp/xbox-live/storage-platform/connected-storage/connected-storage-using-buffers

    【讨论】:

    • 即使没有测试,我也会将其标记为正确,因为它提供了有用的新信息 - 我不知道 IBufferByteAccess。
    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2012-10-05
    • 2012-09-24
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多