diff --git a/src/filesys/openfile.rs b/src/filesys/openfile.rs index deafa89..f013dc6 100644 --- a/src/filesys/openfile.rs +++ b/src/filesys/openfile.rs @@ -76,19 +76,14 @@ impl OpenFile { } first_sector = div_round_down(position,disk::SECTOR_SIZE); - last_sector = div_round_up(position + num_bytes - 1, disk::SECTOR_SIZE); + last_sector = div_round_down(position + num_bytes - 1, disk::SECTOR_SIZE); num_sectors = last_sector - first_sector + 1; let mut buffer = vec![0_u8; (num_sectors * disk::SECTOR_SIZE) as usize]; - let mut sector_buffer = vec![0_u8; disk::SECTOR_SIZE as usize]; for i in first_sector..(last_sector + 1){ - DrvDisk::read_sector(driver_disk, i, &mut sector_buffer); - - for j in 0..sector_buffer.len(){ - buffer.push(sector_buffer[j]); - } + DrvDisk::read_sector(driver_disk, i, &mut buffer); } start = position%disk::SECTOR_SIZE; @@ -133,7 +128,46 @@ impl OpenFile { else if position + num_bytes > file_length{ file.hdr.change_file_length(position + num_bytes); } - 0 + + first_sector = div_round_down(position, disk::SECTOR_SIZE); + last_sector = div_round_down(position + nbr_octet_ecrit - 1, disk::SECTOR_SIZE); + nbr_sectors = last_sector + first_sector + 1; + + let mut buffer = vec![0_u8; (nbr_sectors * disk::SECTOR_SIZE) as usize]; + let mut sector_buffer = vec![0_u8; disk::SECTOR_SIZE as usize]; + + first_aligned = position == first_sector*disk::SECTOR_SIZE;//to use + last_aligned = position + nbr_octet_ecrit == (last_sector + 1)*disk::SECTOR_SIZE;//to use + + /* + A CHANGER + les read & write de disk prenant en param des vec, on ne peut pour l'instant pas copier premier et dernier secteur si mauvais alignement + par defaut, on reconpie tout les secteur du disk de premier a dernier dans buffer, puis on ecrase avec les données dans from + */ + + //on recopie tous les secteurs dans buffer + for i in first_sector..(last_sector + 1){ + driver_disk.read_sector(i, &mut buffer) + } + + //on ecrase dans buffer avec les données de from + let start = position%disk::SECTOR_SIZE; + let end = start + nbr_octet_ecrit - 1; + + for i in start..(end + 1){ + buffer[i as usize] = from[(i-start) as usize]; + } + + //on ecrit, secteur par secteur, en segmentant buffer en secteurs + for i in 0..(nbr_sectors + 1){ + + let j = i*disk::SECTOR_SIZE; + let k = i + disk::SECTOR_SIZE - 1; + //driver_disk.write_sector(i + first_sector, &buffer[i..=k]); + //BESOIN DE CHANGER VEC U8 EN SLICE DANS les fonctions read & write de drv_disk & disk + } + + nbr_octet_ecrit } pub fn read(driver_disk : &mut DrvDisk, file : &mut OpenFile, into : &mut Vec, num_bytes : i32) -> i32 {