לדלג לתוכן

פתרון טווחים וכתיבה וקטורית

הפונקציה הבאה מצטרפת ל־imports של הדוגמה הראשונה. היא מקדמת רק את הטווח שהושלם בפועל.

fn write_full_at(file: &File, mut bytes: &[u8], mut offset: u64) -> io::Result<()> {
    while !bytes.is_empty() {
        match file.write_at(bytes, offset) {
            Ok(0) => return Err(io::ErrorKind::WriteZero.into()),
            Ok(count) => {
                offset = offset.checked_add(count as u64).ok_or_else(||
                    io::Error::new(io::ErrorKind::InvalidInput, "offset overflow"))?;
                bytes = &bytes[count..];
            }
            Err(error) if error.kind() == io::ErrorKind::Interrupted => continue,
            Err(error) => return Err(error),
        }
    }
    Ok(())
}

הטיפול במיקום אינו מבטיח שהפעולה הלוגית כולה אטומית. אם השגיאה מתרחשת אחרי כתיבה חלקית, חלק מהטווח כבר השתנה. לקוח שצריך rollback או התאוששות חייב לבנות אותם בשכבה גבוהה יותר. בדיקת הכותב המדומה צריכה להשוות את הכותרת והגוף המחוברים, כדי לזהות שכפול או דילוג בנקודת המעבר בין הפרוסות.