use std::cell::RefCell; use std::fs::File; use std::io::{Read, Seek, SeekFrom, Write}; use std::path::{Path, PathBuf}; use crate::block_device::{BLOCK_SIZE, BlockDevice}; pub struct Disk { disk_path: PathBuf, device: RefCell, } impl Disk { pub fn new(disk_path: PathBuf) -> Self { let device = File::options() .read(true) .write(true) .open(disk_path.as_path()) .unwrap(); // let device = File::open(disk_path.as_path()).unwrap(); Self { disk_path, device: RefCell::new(device), } } } impl BlockDevice for Disk { fn read(&self, block_id: usize, buffer: &mut [u8]) { let mut device = self.device.borrow_mut(); device .seek(SeekFrom::Start((block_id * BLOCK_SIZE) as u64)) .expect("Unable to seek!"); device .read_exact(buffer) .expect("Failed to read 4096 bytes!"); } fn write(&self, block_id: usize, buffer: &[u8]) { let mut device = self.device.borrow_mut(); device .seek(SeekFrom::Start((block_id * BLOCK_SIZE) as u64)) .expect("Unable to seek!"); device .write_all(buffer) .expect("Unable to write 4096 bytes!"); } }