Skip to content

Archive Recovery

zesven provides tools to recover data from damaged or corrupted archives.

Basic Recovery

rust
use zesven::recovery::{recover_archive, RecoveryOptions, RecoveryStatus};
use zesven::Result;
use std::fs::File;

fn main() -> Result<()> {
    let file = File::open("damaged.7z")?;
    let result = recover_archive(file, RecoveryOptions::default())?;

    match result.status {
        RecoveryStatus::FullRecovery => {
            println!("All {} entries recovered!", result.recovered_count());
        }
        RecoveryStatus::PartialRecovery => {
            println!("Recovered {} entries, {} failed",
                result.recovered_count(),
                result.failed_count());
        }
        RecoveryStatus::HeaderRecovered => {
            println!("Header recovered but some data is corrupt");
        }
        RecoveryStatus::Failed => {
            println!("Could not recover archive");
        }
    }
    Ok(())
}

Recovery Options

Configure recovery behavior:

rust
use zesven::recovery::RecoveryOptions;

let options = RecoveryOptions::new()
    .search_limit(2 * 1024 * 1024)   // Search 2 MiB for signatures
    .validate_crcs(false)             // Skip CRC validation
    .skip_corrupt_entries(true)       // Continue past corrupt entries
    .try_multiple_headers(true);      // Try alternative header locations

Recovery Options

OptionDefaultDescription
search_limit1 MiBMax bytes to search for signatures
validate_crcstrueValidate CRC checksums
skip_corrupt_entriesfalseContinue past corrupt entries
try_multiple_headersfalseTry multiple header locations

Signature Scanner

Find archives embedded in other files:

rust
use zesven::recovery::{find_all_signatures, SignatureScanner};
use zesven::Result;
use std::fs::File;

fn main() -> Result<()> {
    let mut file = File::open("disk_image.bin")?;
    let offsets = find_all_signatures(&mut file, Some(10 * 1024 * 1024))?;

    for offset in offsets {
        println!("Found 7z signature at offset {}", offset);
    }
    Ok(())
}

Recovery Result

The RecoveryResult provides detailed information about the recovery:

rust
use zesven::recovery::{recover_archive, RecoveryOptions};
use zesven::Result;
use std::fs::File;

fn main() -> Result<()> {
    let file = File::open("damaged.7z")?;
    let result = recover_archive(file, RecoveryOptions::default())?;

    // Check recovered entries
    for entry in &result.recovered_entries {
        println!("Recovered: {} ({} bytes, CRC valid: {})",
            entry.path, entry.size, entry.crc_valid);
    }

    // Check failed entries
    for entry in &result.failed_entries {
        let path = entry.path.as_deref().unwrap_or("unknown");
        println!("Failed: {} - {}", path, entry.reason);
    }

    // Check warnings
    for warning in &result.warnings {
        println!("Warning: {}", warning);
    }

    // Recovery statistics
    println!("Recovery rate: {:.1}%", result.recovery_rate() * 100.0);
    Ok(())
}

Recovery Status

StatusDescription
FullRecoveryAll entries recovered successfully
PartialRecoverySome entries recovered, others failed
HeaderRecoveredHeader parsed but data is corrupt
FailedCould not recover archive

Quick Validation

Check if a file is a valid 7z archive:

rust
use zesven::recovery::is_valid_archive;
use zesven::Result;
use std::fs::File;

fn main() -> Result<()> {
    let mut file = File::open("archive.7z")?;
    if is_valid_archive(&mut file)? {
        println!("Valid 7z archive");
    } else {
        println!("Not a valid 7z archive");
    }
    Ok(())
}

Common Corruption Types

CorruptionRecoverability
Truncated fileOften partial recovery
Header damageMay recover data blocks
CRC errorsData recoverable, may be corrupt
Missing volumesOther volumes recoverable

See Also

Released under MIT OR Apache-2.0 License