如何使用 ReadBufferAsync 在 winrt 中读取文件的所有字节?
How to read all bytes of a file in winrt with ReadBufferAsync?
我有一个对象数组,每个对象都需要从二进制文件数据中自行加载。我创建了这些对象的数组,然后为它们中的每一个调用一个 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);
我的想法是,由于缓冲区和 reader 是对象的 class 成员,它们不会超出范围并且可以在下一个对象被要求加载它们自己时不间断地完成它们的工作在单独的 AsyncActions 中。但是 DataReader 可能只获取文件数据的一半或更少。可以做什么来确保它完成?感谢您的任何见解。
[更新] 也许文件系统一次只能处理一个读取任务,并且通过启动所有这些异步读取,每个读取都会中断前一个 -?但是必须有一种方法可以逐步读取一个充满文件的文件夹。
[更新] 我想我已经成功了,通过采用同心循环的原则 - 这个想法是在第一个加载完成之前不进行下一个加载。我认为 - 如果我错了,有人可以纠正我,文件系统不能同时读取。如果有关于如何执行此操作的公认且安全的示例,我仍然很乐意听到它,所以我不会回答我自己的问题。
#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
我有一个对象数组,每个对象都需要从二进制文件数据中自行加载。我创建了这些对象的数组,然后为它们中的每一个调用一个 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);
我的想法是,由于缓冲区和 reader 是对象的 class 成员,它们不会超出范围并且可以在下一个对象被要求加载它们自己时不间断地完成它们的工作在单独的 AsyncActions 中。但是 DataReader 可能只获取文件数据的一半或更少。可以做什么来确保它完成?感谢您的任何见解。
[更新] 也许文件系统一次只能处理一个读取任务,并且通过启动所有这些异步读取,每个读取都会中断前一个 -?但是必须有一种方法可以逐步读取一个充满文件的文件夹。
[更新] 我想我已经成功了,通过采用同心循环的原则 - 这个想法是在第一个加载完成之前不进行下一个加载。我认为 - 如果我错了,有人可以纠正我,文件系统不能同时读取。如果有关于如何执行此操作的公认且安全的示例,我仍然很乐意听到它,所以我不会回答我自己的问题。
#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