読者です 読者をやめる 読者になる 読者になる

Boost.Asioでファイルの非同期読み込み in Windows

C++

boost::asio::windows::stream_handleは、Windowsのハンドルを持つことができるストリーム型。
これを使うと、ファイルの非同期読み込みができる。サンプルはよくないですが、こんな感じです。


a.txt

Hello
#include <iostream>
#include <vector>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/ref.hpp>
#include <boost/scope_exit.hpp>

namespace asio = boost::asio;

void read_end(const boost::system::error_code& error, const std::vector<char>& result)
{
    if (error)
        std::cout << error.message() << std::endl;
    else {
        const std::string s(result.begin(), result.end());
        std::cout << "success : " << s << std::endl;
    }
}

int main()
{
    asio::io_service io_service;

    HANDLE handle = ::CreateFileA("a.txt",
                                 GENERIC_READ,
                                 FILE_SHARE_READ,
                                 NULL,
                                 OPEN_EXISTING,
                                 FILE_FLAG_OVERLAPPED,
                                 NULL);

    if (handle == INVALID_HANDLE_VALUE) {
        std::cout << "cannot open" << std::endl;
        return 1;
    }

    BOOST_SCOPE_EXIT((&handle)) {
        ::CloseHandle(handle);
    } BOOST_SCOPE_EXIT_END;


    std::vector<char> buffer(::GetFileSize(handle, NULL));

    asio::windows::stream_handle file(io_service, handle);

    asio::async_read(file, asio::buffer(buffer.data(), buffer.size()),
        boost::bind(read_end, _1, boost::ref(buffer)));

    io_service.run();

    for (;;) {}
}
Success : Hello


参照:
Stream-Oriented HANDLEs - Boost Asio Library

asio_file_stream.h