diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,12 @@
+zip-archive 0.3.1.1
+
+  * readEntry:  Read file as a strict ByteString.  This avoids
+    problems on Windows, where the file handle wasn't being closed.
+  * Added appveyor.yml to do continuous testing on Windows.
+  * Test suite: remove need for external zip program (#35).
+    Instead of creating an archive with zip, we now store
+    a small externally created zip archive to use for testing.
+
 zip-archive 0.3.1
 
   * Don't use a custom build (#28).
diff --git a/src/Codec/Archive/Zip.hs b/src/Codec/Archive/Zip.hs
--- a/src/Codec/Archive/Zip.hs
+++ b/src/Codec/Archive/Zip.hs
@@ -262,7 +262,7 @@
                     _         -> p)
   contents <- if isDir
                  then return B.empty
-                 else B.readFile path
+                 else B.fromStrict <$> S.readFile path
 #if MIN_VERSION_directory(1,2,0)
   modEpochTime <- fmap (floor . utcTimeToPOSIXSeconds)
                    $ getModificationTime path
diff --git a/tests/test-zip-archive.hs b/tests/test-zip-archive.hs
--- a/tests/test-zip-archive.hs
+++ b/tests/test-zip-archive.hs
@@ -7,8 +7,8 @@
 import System.Directory
 import Test.HUnit.Base
 import Test.HUnit.Text
-import System.Process
-import qualified Data.ByteString.Lazy as B
+import qualified Data.ByteString.Char8 as BS
+import qualified Data.ByteString.Lazy as BL
 import Control.Applicative
 import System.Exit
 import System.IO.Temp (withTempDirectory)
@@ -46,23 +46,27 @@
 testReadWriteArchive :: FilePath -> Test
 testReadWriteArchive tmpDir = TestCase $ do
   archive <- addFilesToArchive [OptRecursive] emptyArchive ["LICENSE", "src"]
-  B.writeFile (tmpDir ++ "/test1.zip") $ fromArchive archive
-  archive' <- toArchive <$> B.readFile (tmpDir ++ "/test1.zip")
+  BL.writeFile (tmpDir ++ "/test1.zip") $ fromArchive archive
+  archive' <- toArchive <$> BL.readFile (tmpDir ++ "/test1.zip")
   assertEqual "for writing and reading test1.zip" archive archive'
   assertEqual "for writing and reading test1.zip" archive archive'
 
 testReadExternalZip :: FilePath -> Test
-testReadExternalZip tmpDir = TestCase $ do
-  _ <- runCommand ("zip -q " ++ tmpDir ++
-           "/test4.zip zip-archive.cabal src/Codec/Archive/Zip.hs") >>=
-           waitForProcess
-  archive <- toArchive <$> B.readFile (tmpDir ++ "/test4.zip")
+testReadExternalZip _tmpDir = TestCase $ do
+  archive <- toArchive <$> BL.readFile "tests/test4.zip"
   let files = filesInArchive archive
-  assertEqual "for results of filesInArchive" ["zip-archive.cabal", "src/Codec/Archive/Zip.hs"] files
-  cabalContents <- B.readFile "zip-archive.cabal"
-  case findEntryByPath "zip-archive.cabal" archive of 
-       Nothing  -> assertFailure "zip-archive.cabal not found in archive"
-       Just f   -> assertEqual "for contents of zip-archive.cabal in archive" cabalContents (fromEntry f)
+  assertEqual "for results of filesInArchive"
+    ["test4/","test4/a.txt","test4/b.bin","test4/c/",
+     "test4/c/with spaces.txt"] files
+  bContents <- BL.readFile "tests/test4/b.bin"
+  case findEntryByPath "test4/b.bin" archive of
+       Nothing  -> assertFailure "test4/b.bin not found in archive"
+       Just f   -> assertEqual "for contents of test4/b.bin in archive"
+                      bContents (fromEntry f)
+  case findEntryByPath "test4/" archive of
+       Nothing  -> assertFailure "test4/ not found in archive"
+       Just f   -> assertEqual "for contents of test4/ in archive"
+                      BL.empty (fromEntry f)
 
 testFromToArchive :: FilePath -> Test
 testFromToArchive _tmpDir = TestCase $ do
@@ -97,15 +101,15 @@
 testExtractFiles tmpDir = TestCase $ do
   createDirectory (tmpDir ++ "/dir1")
   createDirectory (tmpDir ++ "/dir1/dir2")
-  let hiMsg = "hello there"
-  let helloMsg = "Hello there. This file is very long.  Longer than 31 characters."
-  writeFile (tmpDir ++ "/dir1/hi") hiMsg
-  writeFile (tmpDir ++ "/dir1/dir2/hello") helloMsg
+  let hiMsg = BS.pack "hello there"
+  let helloMsg = BS.pack "Hello there. This file is very long.  Longer than 31 characters."
+  BS.writeFile (tmpDir ++ "/dir1/hi") hiMsg
+  BS.writeFile (tmpDir ++ "/dir1/dir2/hello") helloMsg
   archive <- addFilesToArchive [OptRecursive] emptyArchive [(tmpDir ++ "/dir1")]
   removeDirectoryRecursive (tmpDir ++ "/dir1")
   extractFilesFromArchive [OptVerbose] archive
-  hi <- readFile (tmpDir ++ "/dir1/hi")
-  hello <- readFile (tmpDir ++ "/dir1/dir2/hello")
+  hi <- BS.readFile (tmpDir ++ "/dir1/hi")
+  hello <- BS.readFile (tmpDir ++ "/dir1/dir2/hello")
   assertEqual ("contents of " ++ tmpDir ++ "/dir1/hi") hiMsg hi
   assertEqual ("contents of " ++ tmpDir ++ "/dir1/dir2/hello") helloMsg hello
 
diff --git a/tests/test4.zip b/tests/test4.zip
new file mode 100644
Binary files /dev/null and b/tests/test4.zip differ
diff --git a/tests/test4/a.txt b/tests/test4/a.txt
new file mode 100644
--- /dev/null
+++ b/tests/test4/a.txt
@@ -0,0 +1,1 @@
+Hello, this is a test!
diff --git a/tests/test4/b.bin b/tests/test4/b.bin
new file mode 100644
--- /dev/null
+++ b/tests/test4/b.bin
@@ -0,0 +1,1 @@
+ðã¿ölÑ«>Ô0Ø^ÌÔÚªñ@¬ ùÿ
diff --git a/tests/test4/c/with spaces.txt b/tests/test4/c/with spaces.txt
new file mode 100644
--- /dev/null
+++ b/tests/test4/c/with spaces.txt
@@ -0,0 +1,1 @@
+Another file.
diff --git a/zip-archive.cabal b/zip-archive.cabal
--- a/zip-archive.cabal
+++ b/zip-archive.cabal
@@ -1,5 +1,5 @@
 Name:                zip-archive
-Version:             0.3.1
+Version:             0.3.1.1
 Cabal-Version:       >= 1.10
 Build-type:          Simple
 Synopsis:            Library for creating and modifying zip archives.
@@ -12,7 +12,12 @@
 Homepage:            http://github.com/jgm/zip-archive
 Author:              John MacFarlane
 Maintainer:          jgm@berkeley.edu
-Extra-Source-Files:  changelog, README.markdown
+Extra-Source-Files:  changelog,
+                     README.markdown,
+                     tests/test4.zip,
+                     tests/test4/a.txt,
+                     tests/test4/b.bin,
+                     "tests/test4/c/with spaces.txt"
 
 Source-repository    head
   type:              git
