<html><head> <link rel="stylesheet" href="style.css" type="text/css"> <meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type"> <link rel="Start" href="index.html"> <link title="Index of types" rel=Appendix href="index_types.html"> <link title="Index of exceptions" rel=Appendix href="index_exceptions.html"> <link title="Index of values" rel=Appendix href="index_values.html"> <link title="Index of modules" rel=Appendix href="index_modules.html"> <link title="Index of module types" rel=Appendix href="index_module_types.html"> <link title="FileUtil" rel="Chapter" href="FileUtil.html"> <link title="FileUtilStr" rel="Chapter" href="FileUtilStr.html"> <link title="FilePath" rel="Chapter" href="FilePath.html"><title>FileUtil.find</title> </head> <body> <code class="code"><span class="keyword">let</span> find ?(follow = <span class="constructor">Skip</span>) ?match_compile tst fln exec user_acc =<br> <br> <span class="keyword">let</span> user_test =<br> compile_filter ?match_compile tst<br> <span class="keyword">in</span><br> <br> <span class="keyword">let</span> process_file ((user_acc, already_read) <span class="keyword">as</span> acc) st fln = <br> <span class="keyword">if</span> user_test ~pre_stat:st fln <span class="keyword">then</span><br> (exec user_acc fln), already_read<br> <span class="keyword">else</span><br> acc<br> <span class="keyword">in</span><br> <br> <span class="keyword">let</span> skip_action =<br> <span class="keyword">match</span> follow <span class="keyword">with</span> <br> <span class="keywordsign">|</span> <span class="constructor">Skip</span> <span class="keywordsign">|</span> <span class="constructor">AskFollow</span> _ <span class="keywordsign">|</span> <span class="constructor">Follow</span> <span class="keywordsign">-></span><br> ignore <br> <span class="keywordsign">|</span> <span class="constructor">SkipInform</span> f <span class="keywordsign">-></span><br> f<br> <span class="keyword">in</span><br> <br> <span class="keyword">let</span> should_skip fln already_followed =<br> <span class="keyword">match</span> follow <span class="keyword">with</span> <br> <span class="keywordsign">|</span> <span class="constructor">Skip</span> <span class="keywordsign">|</span> <span class="constructor">SkipInform</span> _ <span class="keywordsign">-></span> <br> <span class="keyword">true</span><br> <span class="keywordsign">|</span> <span class="constructor">AskFollow</span> f <span class="keywordsign">-></span> <br> <span class="keyword">if</span> not already_followed <span class="keyword">then</span><br> (f fln) <br> <span class="keyword">else</span><br> <span class="keyword">true</span><br> <span class="keywordsign">|</span> <span class="constructor">Follow</span> <span class="keywordsign">-></span> <br> <span class="keyword">if</span> already_followed <span class="keyword">then</span><br> raise (<span class="constructor">RecursiveLink</span> fln)<br> <span class="keyword">else</span><br> <span class="keyword">false</span><br> <span class="keyword">in</span><br> <br> <span class="keyword">let</span> <span class="keyword">rec</span> find_aux acc fln =<br> <span class="keyword">try</span><br> (<br> <span class="keyword">let</span> st = <br> stat fln<br> <span class="keyword">in</span><br> <span class="keyword">if</span> st.kind = <span class="constructor">Dir</span> <span class="keyword">then</span><br> (<br> <span class="keyword">if</span> st.is_link <span class="keyword">then</span><br> (<br> <span class="keyword">let</span> (user_acc, dir_links) =<br> acc<br> <span class="keyword">in</span><br> <span class="keyword">let</span> cur_link =<br> readlink fln<br> <span class="keyword">in</span><br> <span class="keyword">let</span> dir_links, already_followed = <br> <span class="keyword">try</span><br> (prevent_recursion dir_links cur_link), <span class="keyword">false</span><br> <span class="keyword">with</span> <span class="constructor">RecursiveLink</span> _ <span class="keywordsign">-></span><br> dir_links, <span class="keyword">true</span><br> <span class="keyword">in</span><br> <span class="keyword">let</span> acc = <br> user_acc, dir_links<br> <span class="keyword">in</span><br> <span class="keyword">if</span> should_skip fln already_followed <span class="keyword">then</span><br> (<br> skip_action fln;<br> acc<br> )<br> <span class="keyword">else</span><br> (<br> find_in_dir<br> (process_file acc st fln)<br> fln<br> )<br> )<br> <span class="keyword">else</span><br> (<br> find_in_dir<br> (process_file acc st fln)<br> fln<br> )<br> )<br> <span class="keyword">else</span><br> (<br> process_file acc st fln<br> )<br> )<br> <span class="keyword">with</span> <span class="constructor">FileDoesntExist</span> _ <span class="keywordsign">-></span><br> acc<br> <br> <span class="keyword">and</span> find_in_dir acc drn = <br> <span class="constructor">Array</span>.fold_left<br> (<span class="keyword">fun</span> acc rfln <span class="keywordsign">-></span><br> <span class="keyword">if</span> is_parent rfln <span class="keywordsign">||</span> is_current rfln <span class="keyword">then</span><br> acc<br> <span class="keyword">else</span><br> find_aux acc (concat drn rfln))<br> acc<br> (<span class="constructor">Sys</span>.readdir drn)<br> <span class="keyword">in</span><br> <br> <span class="keyword">let</span> user_acc, _ = <br> find_aux <br> (user_acc, <span class="constructor">SetFilename</span>.empty) <br> (reduce fln)<br> <span class="keyword">in</span><br> user_acc</code></body></html>