2025-05-26 23:24:05 +00:00
|
|
|
use std::{
|
2025-05-26 23:44:29 +00:00
|
|
|
fs::File,
|
|
|
|
|
io::{Read, Seek, SeekFrom},
|
2025-05-26 23:24:05 +00:00
|
|
|
path::PathBuf,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
use log::error;
|
|
|
|
|
|
|
|
|
|
pub struct ChunkedFile<'t> {
|
|
|
|
|
path: &'t PathBuf,
|
|
|
|
|
cnum: u64,
|
|
|
|
|
csize: usize,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<'t> ChunkedFile<'t> {
|
|
|
|
|
pub(super) fn new(path: &'t PathBuf, chunk_size: usize) -> Self {
|
|
|
|
|
Self {
|
|
|
|
|
path,
|
|
|
|
|
cnum: 0,
|
|
|
|
|
csize: chunk_size,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<'t> Iterator for ChunkedFile<'t> {
|
|
|
|
|
type Item = Chunk;
|
|
|
|
|
|
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
|
|
|
let offset = {
|
|
|
|
|
let csize: u64 = self.csize.try_into().unwrap();
|
|
|
|
|
self.cnum * csize
|
|
|
|
|
};
|
|
|
|
|
|
2025-05-26 23:44:29 +00:00
|
|
|
let mut f = File::open(&self.path)
|
2025-05-26 23:24:05 +00:00
|
|
|
.inspect_err(|e| error!("Error opening file: {}", e))
|
|
|
|
|
.ok()?;
|
2025-05-26 23:44:29 +00:00
|
|
|
f.seek(SeekFrom::Start(offset)).ok()?;
|
2025-05-26 23:24:05 +00:00
|
|
|
|
2025-05-26 23:44:29 +00:00
|
|
|
let mut bytes = vec![0; self.csize];
|
2025-05-26 23:24:05 +00:00
|
|
|
let read_len = f
|
2025-05-26 23:44:29 +00:00
|
|
|
.read(&mut bytes)
|
2025-05-26 23:24:05 +00:00
|
|
|
.inspect_err(|e| error!("Error reading file: {}", e))
|
|
|
|
|
.ok()?;
|
2025-05-26 23:44:29 +00:00
|
|
|
bytes.truncate(read_len);
|
2025-05-26 23:24:05 +00:00
|
|
|
|
|
|
|
|
self.cnum += 1;
|
|
|
|
|
|
2025-05-26 23:44:29 +00:00
|
|
|
Some(Self::Item { offset, bytes }).filter(|c| c.bytes.len() > 0)
|
2025-05-26 23:24:05 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub struct Chunk {
|
2025-05-26 23:44:29 +00:00
|
|
|
pub offset: u64,
|
2025-05-26 23:24:05 +00:00
|
|
|
pub bytes: Vec<u8>,
|
|
|
|
|
}
|
2025-05-26 23:44:29 +00:00
|
|
|
|
|
|
|
|
impl Chunk {
|
|
|
|
|
pub fn after(&self) -> u64 {
|
|
|
|
|
let len: u64 = self.bytes.len().try_into().unwrap();
|
|
|
|
|
self.offset + len
|
|
|
|
|
}
|
|
|
|
|
}
|