Skip to content

Commit 8319a14

Browse files
authored
files: add mkdir_p (#57)
1 parent 456ae47 commit 8319a14

2 files changed

Lines changed: 17 additions & 0 deletions

File tree

files.ml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,18 @@ let () =
5555
iter_files "/etc" (fun s _ -> print_endline s)
5656
*)
5757

58+
let mkdir_p ?(perm=0o755) path =
59+
let rec aux path =
60+
if Sys.file_exists path then begin
61+
if not (Sys.is_directory path) then
62+
Exn.fail "mkdir_p: %s exists but is not a directory" path
63+
end else begin
64+
aux (Filename.dirname path);
65+
try Unix.mkdir path perm with Unix.Unix_error (Unix.EEXIST, _, _) -> ()
66+
end
67+
in
68+
aux path
69+
5870
let save_as name ?(mode=0o644) f =
5971
(* not using make_temp_file cause same dir is needed for atomic rename *)
6072
let temp = Printf.sprintf "%s.save.%d.tmp" name (U.gettid ()) in

files.mli

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ val iter_files : string -> (string -> in_channel -> unit) -> unit
1616
val open_out_append_bin : string -> out_channel
1717
val open_out_append_text : string -> out_channel
1818

19+
(** [mkdir_p ?perm path] creates directory [path] and all missing parent
20+
directories. Similar to [mkdir -p]. Raises [Failure] if [path] exists
21+
but is not a directory. Default [perm] is [0o755]. *)
22+
val mkdir_p : ?perm:Unix.file_perm -> string -> unit
23+
1924
(** [save_as filename ?mode f] is similar to
2025
[Control.with_open_file_bin] except that writing is done to a
2126
temporary file that will be renamed to [filename] after [f] has

0 commit comments

Comments
 (0)