Huh.
Last few days I play with asio. I try to read files asynchronously using asio, but asio doesn’t work properly (I think) in this case.
For example, simple code (see below) doesn’t work as I expect.
asio::windows::basic_stream_handle<> handle_; asio::streambuf buf_;
asio::async_read (stream_, buf_, complete_condition_, handler_); |
_Winnie C++ Colorizer |
I expect that asio::async_read reads whole file into buffer buf_, but instead this asio fills buffer with block of data read from begin of file.
Alex advise me try version from cvs.sourceforge. In that version windows::basic_stream_handle doesn’t work properly too, but cvs version contains windows::basic_random_access_handle. Using this class we can build working stream that allow us read files sequentially or randomly. For example we can build following sequential stream:
struct random_handle_wrapper { random_handle_wrapper (asio::io_service &io_service, HANDLE file) : handle_ (io_service, file) , file_ (file) , transfered_ (0) {
}
template <typename MutableBufferSequence, typename ReadHandler> void async_read_some(const MutableBufferSequence& buffers, ReadHandler handler) { handle_.async_read_some_at (transfered_, buffers, handler); }
void move_fwd (size_t transfered) { transfered_ += transfered; }
asio::windows::basic_random_access_handle<> handle_; HANDLE file_; boost::uint64_t transfered_; }; |
_Winnie C++ Colorizer |
And read_handler that uses this stream:
void read_handler (asio::error_code ec, size_t transferred) { std::cout << std::string (data_.c_array(), data_.c_array() + transferred); stream_.move_fwd (transferred); asio::async_read (stream_, buf_, complete_condition_, handler_); } |
_Winnie C++ Colorizer |