-let is_dir fname =
- try
- (Unix.stat fname).Unix.st_kind = Unix.S_DIR
- with Unix.Unix_error _ -> false
-
-let is_regular fname =
- try
- (Unix.stat fname).Unix.st_kind = Unix.S_REG
- with Unix.Unix_error _ -> false
-
-let input_file fname =
- let size = (Unix.stat fname).Unix.st_size in
- let buf = Buffer.create size in
- let ic = open_in fname in
- Buffer.add_channel buf ic size;
- close_in ic;
- Buffer.contents buf
-
-let output_file data file =
- let oc = open_out file in
- output_string oc data;
- close_out oc
-
+let is_dir_empty d =
+ try
+ let od = Unix.opendir d in
+ try
+ ignore (Unix.readdir od);
+ ignore (Unix.readdir od);
+ ignore (Unix.readdir od);
+ Unix.closedir od;
+ false
+ with End_of_file ->
+ Unix.closedir od;
+ true
+ with Unix.Unix_error _ -> true
+
+let safe_rmdir d = try Unix.rmdir d with Unix.Unix_error _ -> ()
+
+let rec rmdir_descend d =
+ if is_dir_empty d then
+ begin
+ safe_rmdir d;
+ rmdir_descend (Filename.dirname d)
+ end