我有一个对象数组,每个对象都需要从二进制文件数据中加载自身。我创建了这些对象的数组,然后为每个对象调用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);
我的想法是,由于缓冲区和读取器是对象的类成员,因此它们不会超出范围,并且可以在下一个对象被要求将自己加载到单独的AsyncActions中时不中断地完成其工作。但是DataReader可能仅获得文件数据的一半或更少。如何确保其完成?感谢您的见解。
[更新]也许正在发生的事情是,文件系统一次只能处理一个读取任务,并且通过启动所有这些异步读取,每个中断了先前的读取--?但是必须有一种逐步读取装满文件的文件夹的方法。
[更新]我认为通过采用同心循环原理可以使它正常工作-这个想法是直到第一个加载完成后才进行下一个加载。我认为-如果我错了,有人可以纠正我,文件系统无法同时读取。如果有一个可以接受的安全示例,我仍然很想听听它的用法,所以我不会回答自己的问题。
答案 0 :(得分: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