Пожалуйста, обратите внимание, что пользователь заблокирован
Код:
use std::fs::OpenOptions;
use std::io::prelude::*;
use std::path::Path;
use std::thread;
use std::time::Duration;
const MB: usize = 1024 * 1024;
fn main() {
let args: Vec<String> = std::env::args().collect();
if args.len() != 3 {
println!("Usage: pump_file <file> <mb>");
return;
}
let path = Path::new(&args[1]);
let mb = args[2].parse::<usize>().expect("Invalid MB argument");
run_background(path, mb);
}
pub fn run_background(path: &Path, mb: usize) {
let join_handle: thread::JoinHandle<_> = thread::spawn(move || {
run_hourly(path, mb);
});
join_handle.forget();
}
pub fn run_hourly(path: &Path, mb: usize) {
loop {
let bytes_to_add = MB * mb;
if file_exists(path) {
let new_size = calculate_new_size(path, bytes_to_add);
println!("{} already exists, new size will be {} bytes.", path.display(), new_size);
} else {
println!("{} does not exist.", path.display());
return;
}
let mut file = OpenOptions::new()
.write(true)
.open(path)
.expect("Failed to open file");
let buf = vec![0u8; bytes_to_add];
file.write_all(&buf).expect("Failed to write null bytes to file");
println!("Successfully added {} MB ({} bytes) to {}", mb, bytes_to_add, path.display());
thread::sleep(Duration::from_secs(3600));
}
}
fn calculate_new_size(path: &Path, bytes_to_add: usize) -> u64 {
let metadata = std::fs::metadata(path).expect("Failed to get file metadata");
metadata.len() + bytes_to_add as u64
}
fn file_exists(path: &Path) -> bool {
std::fs::metadata(path).is_ok()
}