Hello All,<br><br>I want to build a program which will recursively scan a directory and<br>build md5sum for all the files. The intent is to do something similar<br>to unison but more specific to my requirements. I am having trouble in<br>
the initial part of building the md5sums.<br><br>I did some digging around and found that &quot;System.Directory.Tree&quot; is a<br>very close match for what I want to do. In fact after a little poking<br>around I could do exactly what I wanted. <br>
<br>,----<br>| import Monad<br>| import System.Directory.Tree<br>| import System.Directory<br>| import Data.Digest.Pure.MD5<br>| import qualified Data.ByteString.Lazy.Char8 as L<br>| <br>| calcMD5 =<br>|     readDirectoryWith (\x-&gt; liftM md5 (L.readFile x))<br>
`----<br><br>This work perfectly for small directories. readDirectoryWith is<br>already defined in the library and exactly what we want<br><br>,----<br>| *Main&gt; calcMD5 &quot;/home/mitra/Desktop/&quot;<br>| <br>| &quot;/home/mitra&quot; :/ Dir {name = &quot;Desktop&quot;, contents = [File {name =<br>
| &quot;060_LocalMirror_Workflow.t.10.2.62.9.log&quot;, file =<br>| f687ad04bc64674134e55c9d2a06902a},File {name = &quot;cmd_run&quot;, file =<br>| 6f334f302b5c0d2028adeff81bf2a0d9},File {name = &quot;cmd_run~&quot;,<br>`----<br>
<br>However when ever I give it something more challenging it gets into<br>trouble.<br><br>,----<br>| *Main&gt; calcMD5 &quot;/home/mitra/laptop/&quot; <br>| *** Exception: /home/mitra/laptop/ell/calc-2.02f/calc.info-27:<br>
|    openFile: resource exhausted (Too many open files)<br>| *Main&gt; 29~ <br>`----<br><br>If I understand what is happening it seems to be doing all the opens<br>before consuming them via md5. This works fine for small directories<br>
but for any practical setup this could potentially be very large. I<br>tried forcing the md5 evaluation in the hope that the file descriptor<br>will be freed once the entire file is read. That did not help, either<br>because I could not get it right or there is some more subtle I am<br>
missing.<br><br>I also had a look at the code in module &quot;System.Directory.Tree&quot; and<br>although it gave me some understanding of how it works I am no closer<br>to a solution.<br><br>regards<br>-- <br>Anand Mitra<br>
<br>