使用Haskell从zip存档中提取单个文件

时间:2014-08-25 17:59:07

标签: haskell zip zip-conduit

使用zip-conduit库,我想从ZIP存档中提取单个文件(例如bar/foo.txt)。

关于hackage的示例仅显示如何一次提取所有文件。如何只提取单个文件或文件列表?

注意:此问题是使用Q& A风格回答的,因此故意不会展示任何研究成果!

1 个答案:

答案 0 :(得分:4)

官方示例将extractFiles应用于[FilePath]返回的fileNames。您只需将其应用于自定义文件名列表:

import Codec.Archive.Zip (withArchive, extractFiles)
import System.Environment (getArgs)

main = do
    -- ZIP file name: First commandline arg
    zipPath:_ <- getArgs
    withArchive zipPath $
        extractFiles ["bar/foo.txt"] "."

此代码将在当前工作目录中创建文件夹bar,并将文件foo.txt解压缩到所述文件夹中。如果任何此类文件已存在,则会被覆盖。

如果您打算提取到自定义文件名(例如,您要将foo.txt提取到当前工作目录,而不是bar文件夹),则需要使用此示例中所示的管道:

import Codec.Archive.Zip (withArchive, sourceEntry)
import System.Environment (getArgs)
import qualified Data.Conduit.Binary as CB

main = do
    -- ZIP file name: First commandline arg
    zipPath:_ <- getArgs
    withArchive zipPath $
        sourceEntry "bar/foo.txt" $ CB.sinkFile "foo.txt"

您可以使用任何其他conduit接收器,而不是使用CB.sinkFile