let from = Path::new(&src); let to = Path::new(&dest); let x = copy(&from, &to); if x.is_err() { return false; } true } pub fn copy, V: AsRef>(from: U, to: V) -> Result<(), std::io::Error> { let mut stack = Vec::new(); stack.push(PathBuf::from(from.as_ref())); let output_root = PathBuf::from(to.as_ref()); let input_root = PathBuf::from(from.as_ref()).components().count(); while let Some(working_path) = stack.pop() { // println!("process: {:?}", &working_path); // Generate a relative path let src: PathBuf = working_path.components().skip(input_root).collect(); // Create a destination if missing let dest = if src.components().count() == 0 { output_root.clone() } else { output_root.join(&src) }; if fs::metadata(&dest).is_err() { // println!(" mkdir: {:?}", dest); fs::create_dir_all(&dest)?; } for entry in fs::read_dir(working_path)? { let entry = entry?; let path = entry.path(); if path.is_dir() { stack.push(path); } else { match path.file_name() { Some(filename) => { let dest_path = dest.join(filename); // println!(" copy: {:?} -> {:?}", &path, &dest_path); fs::copy(&path, &dest_path)?; } None => { println!("failed: {:?}", path); } } } } } Ok(())