4

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

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

注意:这个问题是使用问答方式回答的,因此故意不显示任何研究工作!

4

1 回答 1

5

官方示例适用extractFiles[FilePath]as 返回的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"

CB.sinkFile您可以使用任何其他导管水槽来代替使用。

于 2014-08-25T17:59:07.237 回答