1 // Copyright 2022 The Chromium OS Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 use super::{PunchHole, WriteZeroesAt}; 6 use std::{cmp::min, fs::File, io, os::windows::fs::FileExt}; 7 8 impl WriteZeroesAt for File { 9 // TODO(b/195151495): Fix so that this will extend a file size if needed. write_zeroes_at(&mut self, offset: u64, length: usize) -> io::Result<usize>10 fn write_zeroes_at(&mut self, offset: u64, length: usize) -> io::Result<usize> { 11 // Try to punch a hole first. 12 if let Ok(()) = self.punch_hole(offset, length as u64) { 13 return Ok(length); 14 } 15 16 // fall back to write() 17 // punch_hole() failed; fall back to writing a buffer of zeroes 18 // until we have written up to length. 19 let buf_size = min(length, 0x10000); 20 let buf = vec![0u8; buf_size]; 21 let mut nwritten: usize = 0; 22 while nwritten < length { 23 let remaining = length - nwritten; 24 let write_size = min(remaining, buf_size); 25 nwritten += self.seek_write(&buf[0..write_size], offset + nwritten as u64)?; 26 } 27 Ok(length) 28 } 29 } 30