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

4
使用zip-conduit库,我想从ZIP归档中提取单个文件(例如bar/foo.txt)。
Hackage上的示例仅显示如何一次提取所有文件。如何只提取单个文件或文件列表?
注意:这个问题是使用问答形式回答的,因此故意不显示任何研究工作!
1个回答

5
官方示例将 extractFiles 应用于由 fileNames 返回的 [FilePath]。您可以将其应用于自定义文件名列表:
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的sink,而不是使用CB.sinkFile


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接