1:- module(file_utilities, [find_files/3]). 2:- meta_predicate find_files(3, -,?, ?). 3
4find_files(Dir,FilePredicate,DirPredicate) :-
5 working_directory(CWD,CWD),
6 absolute_file_name(Dir,XAbs),
7 directory_files(XAbs,Files),
8 traverse_files(Files,XAbs,FilePredicate,DirPredicate),
9 working_directory(_,CWD).
10
11traverse_files([],_,_,_) :- !.
12traverse_files([.|Files],CWD,FilePredicate,DirPredicate) :- traverse_files(Files,CWD,FilePredicate,DirPredicate).
13traverse_files([..|Files],CWD,FilePredicate,DirPredicate) :- traverse_files(Files,CWD,FilePredicate,DirPredicate).
14traverse_files([File|Files],CWD,FilePredicate,DirPredicate) :-
15 working_directory(_,CWD),
16 absolute_file_name(File,FileA),
17 exists_file(FileA),
18 call(FilePredicate,FileA),
19 traverse_files(Files,CWD,FilePredicate,DirPredicate).
20traverse_files([File|Files],CWD,FilePredicate,DirPredicate) :-
21 working_directory(_,CWD),
22 absolute_file_name(File,FileA),
23 exists_directory(FileA),
24 call(DirPredicate,FileA),
25 find_files(FileA,FilePredicate,DirPredicate),
26 traverse_files(Files,CWD,FilePredicate,DirPredicate).
27traverse_files([_|Files],CWD,FilePredicate,DirPredicate) :-
28 traverse_files(Files,CWD,FilePredicate,DirPredicate)