use std::fs::File;
use std::io::{Error, ErrorKind, Result};
pub fn read_at(file: &File, buf: &mut [u8], offset: u64) -> Result<usize> {
let need = buf.len();
let mut done = 0usize;
while done < need {
let n = {
#[cfg(unix)]
{
use std::os::unix::fs::FileExt;
file.read_at(&mut buf[done..], offset + done as u64)?
}
#[cfg(windows)]
{
use std::os::windows::fs::FileExt;
file.seek_read(&mut buf[done..], offset + done as u64)?
}
#[cfg(not(any(unix, windows)))]
{
use std::io::{Read, Seek, SeekFrom};
file.seek(SeekFrom::Start(offset + done as u64))?;
file.read(&mut buf[done..])?
}
};
if n == 0 {
return Err(Error::new(
ErrorKind::UnexpectedEof,
format!("read_at short: got {done}/{need} bytes at offset {offset}"),
));
}
done += n;
}
Ok(done)
}