mirror of
https://github.com/boostorg/asio.git
synced 2026-01-24 17:42:08 +00:00
This change adds support for stream-oriented and random-access files.
For example, to write to a newly created stream-oriented file:
asio::stream_file file(
my_io_context, "/path/to/file",
asio::stream_file::write_only
| asio::stream_file::create
| asio::stream_file::truncate);
file.async_write_some(my_buffer,
[](error_code e, size_t n)
{
// ...
});
or to read from a random-access file:
asio::random_access_file file(
my_io_context, "/path/to/file",
asio::random_access_file::read_only);
file.async_read_some_at(1234, my_buffer,
[](error_code e, size_t n)
{
// ...
});
This feature currently supports I/O completion ports on Windows, and
io_uring on Linux (define BOOST_ASIO_HAS_IO_URING to enable).
66 lines
1.5 KiB
C++
66 lines
1.5 KiB
C++
//
|
|
// blocking_file_copy.cpp
|
|
// ~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
// Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
|
|
#include <iostream>
|
|
#include <boost/asio.hpp>
|
|
|
|
#if defined(BOOST_ASIO_HAS_FILE)
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
try
|
|
{
|
|
if (argc != 3)
|
|
{
|
|
std::cerr << "Usage: blocking_file_copy <from> <to>\n";
|
|
return 1;
|
|
}
|
|
|
|
boost::asio::io_context io_context;
|
|
|
|
boost::asio::stream_file from_file(io_context, argv[1],
|
|
boost::asio::stream_file::read_only);
|
|
|
|
boost::asio::stream_file to_file(io_context, argv[2],
|
|
boost::asio::stream_file::write_only
|
|
| boost::asio::stream_file::create
|
|
| boost::asio::stream_file::truncate);
|
|
|
|
char data[4096];
|
|
boost::system::error_code error;
|
|
for (;;)
|
|
{
|
|
std::size_t n = from_file.read_some(boost::asio::buffer(data), error);
|
|
if (error)
|
|
break;
|
|
boost::asio::write(to_file, boost::asio::buffer(data, n), error);
|
|
if (error)
|
|
break;
|
|
}
|
|
|
|
if (error && error != boost::asio::error::eof)
|
|
{
|
|
std::cerr << "Error copying file: " << error.message() << "\n";
|
|
return 1;
|
|
}
|
|
}
|
|
catch (std::exception& e)
|
|
{
|
|
std::cerr << "Exception: " << e.what() << "\n";
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#else // defined(BOOST_ASIO_HAS_FILE)
|
|
int main() {}
|
|
#endif // defined(BOOST_ASIO_HAS_FILE)
|