Walk a directory/Recursively: Difference between revisions

Content added Content deleted
(Added Oz example.)
(→‎{{header|OCaml}}: a little bit simpler)
Line 444: Line 444:
let walk_directory_tree dir pattern =
let walk_directory_tree dir pattern =
let select str = Str.string_match (Str.regexp pattern) str 0 in
let select str = Str.string_match (Str.regexp pattern) str 0 in
let rec walk dir =
let rec walk acc = function
| [] -> (acc)
let contents = Array.to_list (Sys.readdir dir) in
| dir::tail ->
let contents = List.rev_map (Filename.concat dir) contents in
let contents = Array.to_list (Sys.readdir dir) in
let dirs, files =
List.fold_left (fun (dirs,files) f ->
let contents = List.rev_map (Filename.concat dir) contents in
let dirs, files =
match (stat f).st_kind with
| S_REG -> (dirs, f::files) (* Regular file *)
List.fold_left (fun (dirs,files) f ->
| S_DIR -> (f::dirs, files) (* Directory *)
match (stat f).st_kind with
| _ -> (dirs, files)
| S_REG -> (dirs, f::files) (* Regular file *)
) ([],[]) contents
| S_DIR -> (f::dirs, files) (* Directory *)
| _ -> (dirs, files)
in
) ([],[]) contents
let matched = List.filter (select) files in
in
(* recursively walk into sub-directories: *)
let results =
let matched = List.filter (select) files in
List.fold_left (fun acc dir ->
walk (matched @ acc) (dirs @ tail)
let sub_result = walk dir in
List.rev_append sub_result acc
) matched dirs
in
(results)
in
in
walk dir
walk [] [dir]
;;
;;