Copy a File with mkdir without Causing an Infinite Loop in notify/watchexec in Rust

September 2025
use std::path::PathBuf;

pub fn copy_file_with_mkdir(input_path: &PathBuf, output_path: &PathBuf) -> Result<(), std::io::Error> {
  if let Some(parent_dir) = output_path.parent() {
    std::fs::create_dir_all(parent_dir)?;
  }
  let data = std::fs::read(input_path)?;
  std::fs::write(output_path, &data)?;
  Ok(())
}

// testing
fn main() {
  vec![
    (
      "copy_mkdir_test_rust/input_dir/alfa.txt", 
      "copy_mkdir_test_rust/output_dir/alfa.txt", 
    ),
    (
      "copy_mkdir_test_rust/input_dir/sample.png", 
      "copy_mkdir_test_rust/output_dir/sample.png", 
    ),
    (
      "copy_mkdir_test_rust/input_dir/sub-dir/bravo.txt", 
      "copy_mkdir_test_rust/output_dir/sub-dir/bravo.txt", 
    ),
    (
      "copy_mkdir_test_rust/input_dir/sub-dir/another-dir/charlie.txt", 
      "copy_mkdir_test_rust/output_dir/sub-dir/another-dir/charlie.txt", 
    )
  ]
  .iter()
  .for_each(|paths| {
    let input_path = PathBuf::from(paths.0);
    let output_path = PathBuf::from(paths.1);
    copy_file_with_mkdir(&input_path, &output_path).unwrap();
    ()
  });
  println!("done.");
}
Output:
done.
end of line