let with_cur_dir dir func =
  let old_dir = Sys.getcwd () in
  let finally () = chdir old_dir
  in
    try
      if not (is_directory dir)
      then
        failwith
          (Printf.sprintf "Filew.with_cur_dir: directory does not exist: %S"
             dir)
      else
        (let () = chdir dir in let r = func () in let () = finally () in r)
    with | e -> (finally (); raise e)