let rm ?(force=Force) ?(recurse=false) fln_lst =
let cfile = (And(Custom (doit force),Or(Not(Is_dir),Is_link)))
in
let cdir = (And(Custom (doit force),Is_dir))
in
let rmdir () fln =
try
Unix.rmdir fln
with Unix.Unix_error(Unix.ENOTEMPTY,_,_) ->
raise (RmDirNotEmpty fln)
in
let rmfile () fln =
Unix.unlink fln
in
let rmfull fln =
find cfile fln rmfile ();
let set_dir =
find cdir fln
( fun set fln -> SetFilename.add fln set) SetFilename.empty
in
List.iter (rmdir ()) (SetFilename.elements set_dir)
in
if recurse then
List.iter rmfull fln_lst
else
begin
List.iter (rmfile ()) (filter cfile fln_lst);
List.iter (rmdir ()) (filter cdir fln_lst)
end