Трейт Async Seek
pub trait AsyncSeek {
// Required methods
fn start_seek(self: Pin<&mut Self>, position: SeekFrom) -> Result<()>;
fn poll_complete(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Result<u64>>;
}
Асинхронный поиск байтов.
Этот трейт аналогичен трейту std::io::Seek, но интегрируется с системой асинхронных задач. В частности, метод start_seek, в отличие от Seek::seek, не блокирует вызывающий поток.
Утилиты для работы со значениями AsyncSeek предоставляются треитом AsyncSeekExt.
Обязательные методы
fn start_seek(self: Pin<&mut Self>, position: SeekFrom) -> Result<()>
Пытается выполнить поиск по смещению в байтах в потоке.
Поиск за концом потока разрешён, но поведение определяется реализацией.
Если эта функция завершается успешно, задание отправлено. Чтобы узнать, когда оно завершится, вызовите poll_complete.
Ошибки
Эта функция может вернуть io::ErrorKind::Other, если уже выполняется другой поиск. Чтобы избежать этого, рекомендуется перед каждым вызовом start_seek вызывать poll_complete, чтобы убедиться, что все ожидающие поисковые операции завершены.
fn poll_complete( self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Result<u64>>
Ожидает завершения операции поиска.
Если операция поиска завершилась успешно, этот метод возвращает новую позицию относительно начала потока. Эту позицию впоследствии можно использовать с SeekFrom::Start.
На позицию, возвращаемую этим методом, можно полагаться только сразу после вызова start_seek. Если после вызова start_seek вы изменили позицию, например, чтением или записью, не определено, учитывает ли возвращаемая позиция это изменение. Аналогично, если start_seek никогда не вызывался, не определено, возвращает ли poll_complete фактическую позицию или какое-либо другое условное значение (например, 0).
Ошибки
Поиск по отрицательному смещению считается ошибкой.
Совместимость с dyn
Этот трейт совместим с dyn.
В старых версиях Rust совместимость с dyn называлась «безопасностью объектов».
Реализации для внешних типов
Реализаторы
impl AsyncSeek for Empty
io-util.impl AsyncSeek for File
fs.impl<R: AsyncRead + AsyncSeek> AsyncSeek for BufReader<R>
io-util.Перемещается к смещению в байтах во внутреннем средстве чтения.
Позиция, используемая для перемещения с помощью SeekFrom::Current(_), — это позиция, в которой находилось бы внутреннее средство чтения, если бы у BufReader не было внутреннего буфера.
При перемещении внутренний буфер всегда отбрасывается, даже если позиция перемещения в противном случае находилась бы в его пределах. Это гарантирует, что вызов .into_inner() сразу после перемещения вернёт внутреннее средство чтения в ту же позицию.
Подробнее см. в разделе AsyncSeek.
Примечание: В редком случае, когда выполняется перемещение с помощью SeekFrom::Current(n), при котором n минус длина внутреннего буфера выходит за пределы i64, вместо одного перемещения будут выполнены два. Если второе перемещение вернёт Err, внутреннее средство чтения останется в той же позиции, в которой оно находилось бы при вызове seek с SeekFrom::Current(0).
impl<RW: AsyncRead + AsyncWrite + AsyncSeek> AsyncSeek for BufStream<RW>
io-util.Перемещается к смещению в байтах во внутреннем потоке.
Позиция, используемая для перемещения с помощью SeekFrom::Current(_), — это позиция, в которой находился бы внутренний поток, если бы у BufStream не было внутреннего буфера.
При перемещении внутренний буфер всегда отбрасывается, даже если позиция перемещения в противном случае находилась бы в его пределах. Это гарантирует, что вызов .into_inner() сразу после перемещения вернёт внутреннее средство чтения в ту же позицию.
Подробнее см. в разделе AsyncSeek.
Примечание: В редком случае, когда выполняется перемещение с помощью SeekFrom::Current(n), при котором n минус длина внутреннего буфера выходит за пределы i64, вместо одного перемещения будут выполнены два. Если второе перемещение вернёт Err, внутреннее средство чтения останется в той же позиции, в которой оно находилось бы при вызове seek с SeekFrom::Current(0).
impl<W: AsyncWrite + AsyncSeek> AsyncSeek for BufWriter<W>
io-util.Перемещается к смещению в байтах во внутреннем средстве записи.
Перед перемещением внутренний буфер всегда записывается.
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/io/trait.AsyncSeek.html