diff --git a/System/Directory/Tree.hs b/System/Directory/Tree.hs
--- a/System/Directory/Tree.hs
+++ b/System/Directory/Tree.hs
@@ -49,6 +49,7 @@
        -- ** Handling failure
        , successful
        , anyFailed
+       , failed
        , failures
        , failedMap
        -- ** Misc.
@@ -57,6 +58,11 @@
 
 {- 
 TODO:
+    - add whatever needed to make an efficient 'du' simple
+        - look at using 'withFile' ?
+        - strictness ? what does this do when called on a big 
+          directory tree and we only use the top level ?
+
     - add some tests
     - tree combining functions
     - tree searching based on file names
@@ -68,8 +74,9 @@
 import System.FilePath
 import System.IO
 import Control.Exception (handle, IOException)
+import System.IO.Error(ioeGetErrorType,isDoesNotExistErrorType)
 
-import Data.Function (on)
+import Data.Ord (comparing)
 import Data.List (sort, (\\))
 
 import Control.Applicative
@@ -94,7 +101,7 @@
 
 
 instance (Ord a)=> Ord (DirTree a) where
-    compare = compare `on` name
+    compare = comparing name
 
 
 -- | a simple wrapper to hold a base directory name, which can be either 
@@ -129,7 +136,10 @@
 
 
 -- | build an AnchoredDirTree, given the path to a directory, opening the files
--- using readFile.
+-- using readFile. 
+-- Uses `readDirectoryWith` internally and has the effect of traversing the
+-- entire directory structure, so is not suitable for running on large directory
+-- trees (suggestions or patches welcomed):
 readDirectory :: FilePath -> IO (AnchoredDirTree String)
 readDirectory = readDirectoryWith readFile
 
@@ -175,7 +185,11 @@
 build :: FilePath -> IO (AnchoredDirTree FilePath)
 build p = do let base = baseDir p
              tree <- build' p
-             return (base :/ tree)
+              -- we make sure the directory tree is free of non-existent
+              -- file errors, which are artifacts of the "non-atomic"
+              -- nature of traversing a system firectory tree.
+             let treeClean = removeNonexistent tree
+             return (base :/ treeClean)
                      
 -- HELPER: not exported:
 build' :: FilePath -> IO (DirTree FilePath)
@@ -202,7 +216,6 @@
 
 
 
-
 ---- HANDLING FAILURES ----
 
 -- | True if any Failed constructors in the tree
@@ -214,6 +227,12 @@
 successful = null . failures
 
 
+-- | returns true if argument is a `Failed` constructor:
+failed :: DirTree a -> Bool
+failed (Failed _ _) = True
+failed _            = False
+
+
 -- | returns a list of 'Failed' constructors only:
 failures :: DirTree a -> [DirTree a]
 failures (Dir _ cs) = concatMap failures cs
@@ -286,3 +305,19 @@
 getDirsFiles cs = do let cs' = if null cs then "." else cs 
                      dfs <- getDirectoryContents cs'
                      return $ sort $ dfs \\ [".",".."]
+
+
+
+-- DoesNotExist errors not present at the topmost level could happen if a
+-- named file or directory is deleted after being listed by 
+-- getDirectoryContents but before we can get it into memory. 
+--    So we filter those errors out because the user should not see errors 
+-- raised by the internal implementation of this module:
+--     This leaves the error if it exists in the top (user-supplied) level:
+removeNonexistent :: DirTree a -> DirTree a
+removeNonexistent (Dir n cs) = 
+    Dir n $ map removeNonexistent $ filter isOkConstructor cs
+        
+     where isOkConstructor c = not (failed c) || isOkError c
+           isOkError = not . isDoesNotExistErrorType . ioeGetErrorType . err
+removeNonexistent f = f
diff --git a/directory-tree.cabal b/directory-tree.cabal
--- a/directory-tree.cabal
+++ b/directory-tree.cabal
@@ -1,5 +1,5 @@
 name:            directory-tree
-version:         0.2.0
+version:         0.2.1
 homepage:        http://coder.bsimmons.name/blog/2009/05/directory-tree-module-released/
 synopsis:        A simple directory-like tree datatype, with useful IO functions 
 description:     A simple directory-like tree datatype, with useful IO functions and Foldable and Traversable instance  
@@ -39,7 +39,12 @@
  > import qualified Data.ByteString.Lazy as B
  > do (_ :/ dTree) <- readDirectoryWith B.readFile "./"     
  .
- Please send me any comments, requests or bug reports
+ *NOTE:* the IO functions like `readDirectoryWith` in this library use standard lazy IO 
+ IOfunctions and will (necessarily) traverse an entire system directory tree before
+ returning a DirTree constructor. This unfortunately makes it not suitable for large
+ directory trees.
+ 
+ Any ideas or suggestions for improvements would be most welcomed :-)
  .
  
 category:        Data, System
