diff --git a/Data/Conduit/Binary.hs b/Data/Conduit/Binary.hs
--- a/Data/Conduit/Binary.hs
+++ b/Data/Conduit/Binary.hs
@@ -4,9 +4,11 @@
 module Data.Conduit.Binary
     ( sourceFile
     , sourceHandle
+    , sourceIOHandle
     , sourceFileRange
     , sinkFile
     , sinkHandle
+    , sinkIOHandle
     , conduitFile
     , isolate
     , openFile
@@ -54,19 +56,13 @@
 sourceFile :: ResourceIO m
            => FilePath
            -> Source m S.ByteString
-sourceFile fp = sourceIO
+sourceFile fp =
 #if CABAL_OS_WINDOWS || NO_HANDLES
-    (F.openRead fp)
-    F.close
-    (liftIO . F.read)
+    sourceIO (F.openRead fp)
+             F.close
+             (liftIO . F.read)
 #else
-    (IO.openBinaryFile fp IO.ReadMode)
-    IO.hClose
-    (\handle -> do
-        bs <- liftIO $ S.hGetSome handle 4096
-        if S.null bs
-            then return Closed
-            else return $ Open bs)
+    sourceIOHandle (IO.openBinaryFile fp IO.ReadMode)
 #endif
 
 -- | Stream the contents of a 'IO.Handle' as binary data. Note that this
@@ -86,6 +82,22 @@
     , sourceClose = return ()
     }
 
+-- | An alternative to 'sourceHandle'.
+-- Instead of taking a pre-opened 'IO.Handle', it takes an action that opens
+-- a 'IO.Handle' (in read mode), so that it can open it only when needed
+-- and close it as soon as possible.
+--
+-- Since 0.1.1
+sourceIOHandle :: ResourceIO m
+               => IO IO.Handle
+               -> Source m S.ByteString
+sourceIOHandle alloc = sourceIO alloc IO.hClose
+    (\handle -> do
+        bs <- liftIO (S.hGetSome handle 4096)
+        if S.null bs
+            then return Closed
+            else return $ Open bs)
+
 -- | Stream all incoming data to the given 'IO.Handle'. Note that this function
 -- will /not/ automatically close the @Handle@ when processing completes.
 --
@@ -98,6 +110,19 @@
     , sinkClose = return ()
     }
 
+-- | An alternative to 'sinkHandle'.
+-- Instead of taking a pre-opened 'IO.Handle', it takes an action that opens
+-- a 'IO.Handle' (in write mode), so that it can open it only when needed
+-- and close it as soon as possible.
+--
+-- Since 0.1.1
+sinkIOHandle :: ResourceIO m
+             => IO IO.Handle
+             -> Sink S.ByteString m ()
+sinkIOHandle alloc = sinkIO alloc IO.hClose
+    (\handle bs -> liftIO (S.hPut handle bs) >> return Processing)
+    (const $ return ())
+
 -- | Stream the contents of a file as binary data, starting from a certain
 -- offset and only consuming up to a certain number of bytes.
 --
@@ -149,11 +174,7 @@
 sinkFile :: ResourceIO m
          => FilePath
          -> Sink S.ByteString m ()
-sinkFile fp = sinkIO
-    (IO.openBinaryFile fp IO.WriteMode)
-    IO.hClose
-    (\handle bs -> liftIO (S.hPut handle bs) >> return Processing)
-    (const $ return ())
+sinkFile fp = sinkIOHandle (IO.openBinaryFile fp IO.WriteMode)
 
 -- | Stream the contents of the input to a file, and also send it along the
 -- pipeline. Similar in concept to the Unix command @tee@.
diff --git a/conduit.cabal b/conduit.cabal
--- a/conduit.cabal
+++ b/conduit.cabal
@@ -1,5 +1,5 @@
 Name:                conduit
-Version:             0.1.0
+Version:             0.1.1
 Synopsis:            Streaming data processing library.
 Description:
 	Conduits are an approach to the streaming data problem. It is meant as an alternative to enumerators\/iterators, hoping to address the same issues with different trade-offs based on real-world experience with enumerators. For more information, see <http://www.yesodweb.com/book/conduit>.
