Hi Again,<br><br>Thanks to the help from this group I have got past my first problem and now stuck on another. I have succeeded in building a DirTree using library &quot;System.Directory.Tree&quot; with properties of md5sum and modification time. I have also built  the parts that can compare two such trees and find the files that have changed.<br>
<br>I was trying to serializing the tree so that it can be saved for later identification of changed files. The module &quot;Tree&quot; incidentally derives Show but not Read and hence I cannot read the file serialized file. Searching a bit I decided to use the infrastructure in &quot;Data.Binary&quot; to do the job for me.<br>
<br>As soon as I started this I realized that I would have to modify Tree.hs module. This was required because DirTree does not derive from Typeable and Data which is required for it to be serialized via &quot;Data.Binary&quot;. After patching the Binary module to derive from Typeable and Data I get the following error.<br>
<br><br>System/Directory/Tree.hs:95:47:<br>    No instance for (Data Exception)<br>      arising from the &#39;deriving&#39; clause of a data type declaration<br>                   at System/Directory/Tree.hs:95:47-50<br>
    Possible fix:<br>      add an instance declaration for (Data Exception)<br>      or use a standalone &#39;deriving instance&#39; declaration instead,<br>         so you can specify the instance context yourself<br>    When deriving the instance for (Data (DirTree a))<br>
Failed, modules loaded: BinaryDerive.<br><br>Secondly I suspect that I could have derived it without having to modify the original module source. The compilation error does give a hint about &quot;standalone deriving instance&quot; but trying stuff at <a href="http://www.haskell.org/ghc/docs/6.12.2/html/users_guide/deriving.html">http://www.haskell.org/ghc/docs/6.12.2/html/users_guide/deriving.html</a> did not help me much.<br>
<br>In short what is the simplest way I can serialize &quot;System.Directory.Tree&quot; using Binary. Is there a better alternative to Binary for serialization ? Are there solutions to the problem I have outlined above ? or is my approach incorrect. Is it possible to add the deriving of datatype DirTree without modifying the module ?<br>
<br>regards<br>-- <br>Anand Mitra<br><br><div class="gmail_quote"><br>On Mon, Jun 7, 2010 at 5:36 PM, Anand Mitra <span dir="ltr">&lt;<a href="mailto:anand.mitra@gmail.com">anand.mitra@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
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><font color="#888888">Anand Mitra<br>

<br>
</font></blockquote></div><br>