From e9f7f2c7ddda159aa75e9633bc6f7fe1e399cf3a Mon Sep 17 00:00:00 2001 From: milner Date: Sat, 21 May 2022 12:14:44 +0000 Subject: [PATCH] feat(fs): add recursive mkdir, whole-file IO and mtime reads Path joining, read, write, is_dir and mtime, used by every later stage that touches disk. --- lib/fs.ml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 lib/fs.ml diff --git a/lib/fs.ml b/lib/fs.ml new file mode 100644 index 0000000..83bba09 --- /dev/null +++ b/lib/fs.ml @@ -0,0 +1,29 @@ +let rec mkdir_p dir = + if dir <> "" && dir <> "." && dir <> "/" && not (Sys.file_exists dir) then begin + mkdir_p (Filename.dirname dir); + try Unix.mkdir dir 0o755 with Unix.Unix_error (Unix.EEXIST, _, _) -> () + end + +let is_dir p = try Sys.is_directory p with Sys_error _ -> false + +let read path = + let ic = open_in_bin path in + let n = in_channel_length ic in + let s = really_input_string ic n in + close_in ic; + s + +let write path s = + mkdir_p (Filename.dirname path); + let oc = open_out_bin path in + output_string oc s; + close_out oc + +let rec rm_rf p = + if is_dir p then begin + Array.iter (fun e -> rm_rf (Filename.concat p e)) (Sys.readdir p); + try Unix.rmdir p with Unix.Unix_error _ -> () + end + else if Sys.file_exists p then try Sys.remove p with Sys_error _ -> () + +let mtime p = try Some (Unix.stat p).Unix.st_mtime with Unix.Unix_error _ -> None