diff --git a/Distribution/Cab/Commands.hs b/Distribution/Cab/Commands.hs
--- a/Distribution/Cab/Commands.hs
+++ b/Distribution/Cab/Commands.hs
@@ -5,10 +5,10 @@
   , genpaths, check, initSandbox, add, ghci
   ) where
 
-import Control.Applicative hiding (many)
-import Control.Monad
-import Data.Char
-import Data.List (isPrefixOf, isSuffixOf, intercalate)
+import Control.Applicative ((<$>))
+import Control.Monad (forM_, unless, when, void)
+import Data.Char (toLower)
+import Data.List (intercalate, isPrefixOf)
 import qualified Data.Map as M
 import Distribution.Cab.GenPaths
 import Distribution.Cab.PkgDB
@@ -16,9 +16,11 @@
 import Distribution.Cab.Sandbox
 import Distribution.Cab.VerDB
 import Distribution.Cab.Version
-import System.Exit
-import System.IO
-import System.Process hiding (env)
+import System.Directory (doesDirectoryExist, removeDirectoryRecursive)
+import System.Exit (exitFailure)
+import System.FilePath (takeDirectory, takeFileName)
+import System.IO (hPutStrLn, stderr)
+import System.Process (readProcess, system)
 
 ----------------------------------------------------------------
 
@@ -103,23 +105,44 @@
     doit = OptNoharm `notElem` opts
 
 purge :: Bool -> [Option] -> (String,String) -> IO ()
-purge doit opts (name,ver) = do
---    putStrLn $ "Deleting " ++ name ++ " " ++ ver
+purge doit opts nameVer = do
     sandboxOpts <- (makeOptList . getSandboxOpts2) <$> getSandbox
-    libdirs <- queryGhcPkg sandboxOpts "library-dirs"
-    haddoc  <- cutTrailing "html" `fmap` queryGhcPkg sandboxOpts "haddock-html"
-    unregister doit opts (name,ver)
-    putStrLn $ unwords ["Deleting dirs:", libdirs, haddoc]
-    when doit . void . system . unwords $ ["rm -rf ", libdirs, haddoc]
+    dirs <- getDirs nameVer sandboxOpts
+    unregister doit opts nameVer
+    mapM_ (removeDir doit) dirs
   where
     makeOptList "" = []
     makeOptList x  = [x]
-    queryGhcPkg sandboxOpts field = do
-        let options = ["field"] ++ sandboxOpts ++ [name ++ "-" ++ ver, field]
-        (!!1) . words <$> readProcess "ghc-pkg" options ""
-    cutTrailing suffix s
-      | suffix `isSuffixOf` s = reverse . drop (length suffix) . reverse $ s
-      | otherwise             = s
+
+getDirs :: (String,String) -> [String] -> IO [FilePath]
+getDirs (name,ver) sandboxOpts = do
+    libdirs <- queryGhcPkg "library-dirs"
+    haddock <- map docDir <$> queryGhcPkg "haddock-html"
+    return $ topDir $ libdirs ++ haddock
+  where
+    nameVer = name ++ "-" ++ ver
+    queryGhcPkg field = do
+        let options = ["field"] ++ sandboxOpts ++ [nameVer, field]
+        ws <- words <$> readProcess "ghc-pkg" options ""
+        return $ case ws of
+            []     -> []
+            (_:xs) -> xs
+    docDir dir
+      | takeFileName dir == "html" = takeDirectory dir
+      | otherwise                  = dir
+    topDir []     = []
+    topDir ds@(dir:_)
+      | takeFileName top == nameVer = top : ds
+      | otherwise                   = ds
+      where
+        top = takeDirectory dir
+
+removeDir :: Bool -> FilePath -> IO ()
+removeDir doit dir = do
+    exist <- doesDirectoryExist dir
+    when exist $ do
+        putStrLn $ "Deleting " ++ dir
+        when doit $ removeDirectoryRecursive dir
 
 unregister :: Bool -> [Option] -> (String,String) -> IO ()
 unregister doit _ (name,ver) =
diff --git a/Distribution/Cab/VerDB.hs b/Distribution/Cab/VerDB.hs
--- a/Distribution/Cab/VerDB.hs
+++ b/Distribution/Cab/VerDB.hs
@@ -14,6 +14,7 @@
 
 import Control.Applicative
 import Control.Arrow (second)
+import Control.Monad.Trans.Resource (runResourceT)
 import Data.Attoparsec.ByteString.Char8
 import Data.Conduit
 import Data.Conduit.Attoparsec
diff --git a/cab.cabal b/cab.cabal
--- a/cab.cabal
+++ b/cab.cabal
@@ -1,5 +1,5 @@
 Name:                   cab
-Version:                0.2.9
+Version:                0.2.10
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
@@ -23,14 +23,15 @@
   Build-Depends:        base >= 4.0 && < 5
                       , Cabal
                       , attoparsec >= 0.10
-                      , attoparsec-conduit >= 0.3
                       , bytestring
-                      , conduit >= 0.3
+                      , conduit >= 1.1
+                      , conduit-extra
                       , containers
                       , directory
                       , filepath
                       , process
-                      , process-conduit >= 0.1
+                      , process-conduit >= 1.1
+                      , resourcet
   Exposed-Modules:	Distribution.Cab
                         Distribution.Cab.PkgDB
                         Distribution.Cab.Printer
@@ -50,18 +51,14 @@
                       , cab
                       , Cabal >= 1.18
                       , attoparsec >= 0.10
-                      , attoparsec-conduit >= 0.3
                       , bytestring
-                      , conduit >= 0.3
+                      , conduit >= 1.1
+                      , conduit-extra
                       , containers
                       , directory
                       , filepath
                       , process
-                      , process-conduit >= 0.1
-  if os(windows)
-     Build-Depends:
-  else
-     Build-Depends:     unix
+                      , process-conduit >= 1.1
   Other-Modules:	Commands
                         Doc
                         Help
