1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
use std::borrow::Borrow;
use std::fs::File;
use std::io;
#[cfg(unix)]
use std::os::unix::fs::FileExt;
#[cfg(windows)]
use std::os::windows::fs::FileExt;
/// Trait offering a uniform `pread` for positioned reads, with platform
/// dependent side-effects.
///
/// For `File` (and any `Borrow<File>`), this is implemented using the
/// platform dependent standard `FileExt` traits. To maintain portability and
/// consistency on all platforms, the user is advised to avoid concurrent,
/// direct reads or writes on a `File` (via its own `Read`/`Write`
/// implementation) while any instances of this interface are in use for the
/// same `File`, and to re-`seek` to a known file position after such use.
pub trait PosRead {
/// Read bytes, starting at the specified offset, into the specified
/// buffer and return the number of bytes read. The offset is from the
/// start of the underlying file or file range. Reads beyond the end of
/// available bytes will return 0 length. The position of the underlying
/// file pointer (aka cursor) is not used. It is platform dependent
/// whether the underlying file pointer is modified by this operation.
fn pread(&self, buf: &mut [u8], offset: u64) -> io::Result<usize>;
}
impl<B> PosRead for B
where B: Borrow<File>
{
#[cfg(unix)]
#[inline]
fn pread(&self, buf: &mut [u8], offset: u64) -> io::Result<usize> {
self.borrow().read_at(buf, offset)
}
#[cfg(windows)]
#[inline]
fn pread(&self, buf: &mut [u8], offset: u64) -> io::Result<usize> {
self.borrow().seek_read(buf, offset)
}
}