upload.rs
919 Bytes
use std::io::SeekFrom;
use async_std::fs::File;
use futures::{AsyncSeekExt, AsyncReadExt};
async fn read_at( f :&mut File
, pos :SeekFrom
, buf :&mut [u8]) -> std::io::Result<()> {
f.seek(pos).await?;
f.read_exact(buf).await
}
pub async fn get_sample( f :&mut File
, buf :&mut [u8]) -> std::io::Result<()> {
let file_len = f.metadata().await?.len();
let chunk_size = buf.len() / 3;
read_at(f, SeekFrom::Start(0), &mut buf[0..chunk_size]).await?;
if file_len >= 2 * chunk_size as u64 {
read_at( f
, SeekFrom::End(-(chunk_size as i64))
, &mut buf[2*chunk_size..]).await?;
}
if file_len >= 3 * chunk_size as u64 {
read_at( f
, SeekFrom::Start((file_len-chunk_size as u64) / 2)
, &mut buf[chunk_size..2*chunk_size]).await?;
}
Ok(())
}