Как прочитать все байты файла в WinRt с ReadBufferAsync? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть массив объектов, каждый из которых должен загрузить себя из данных двоичного файла.Я создаю массив этих объектов, а затем вызываю AsyncAction для каждого из них, который начинает его чтение в своих данных.Проблема в том, что они загружаются не полностью - они, как правило, получают только часть данных из файлов.Как я могу убедиться, что все прочитано?Вот схема кода: сначала я перечисляю содержимое папки, чтобы получить StorageFile для каждого файла, который она содержит.Затем в цикле for каждый принимающий объект создается и передается следующий StorageFile, и он создает свой собственный буфер и 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 получает только половину данных файла или меньше.Что можно сделать, чтобы убедиться, что оно завершено?Спасибо за любые идеи.

[Обновить] Возможно, дело в том, что файловая система может обрабатывать только одну задачу чтения за раз, и при запуске всех этих асинхронных операций чтения каждая прерывает предыдущую -?Но должен быть способ постепенного чтения папки, полной файлов.

[Обновление] Я думаю, что она работает, приняв принцип концентрических циклов - идея не в том, чтобы перейти к следующей загрузке, покаПервый закончен.Я думаю - кто-то может исправить меня, если я ошибаюсь, что файловая система не может выполнять одновременное чтение.Если есть приемлемый и надежный пример того, как это сделать, я все равно хотел бы услышать об этом, поэтому я не отвечаю на свой вопрос.

1 Ответ

0 голосов
/ 08 декабря 2018
    #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

...