【发布时间】:2014-08-26 01:59:07
【问题描述】:
使用 zip-conduit 库,我想从 ZIP 存档中提取单个文件(例如 bar/foo.txt)。
关于 hackage 的示例仅显示如何一次提取所有文件。如何仅提取单个文件或文件列表?
注意:这个问题是用问答方式回答的,因此故意不显示任何研究工作!
【问题讨论】:
标签: haskell zip zip-conduit
使用 zip-conduit 库,我想从 ZIP 存档中提取单个文件(例如 bar/foo.txt)。
关于 hackage 的示例仅显示如何一次提取所有文件。如何仅提取单个文件或文件列表?
注意:这个问题是用问答方式回答的,因此故意不显示任何研究工作!
【问题讨论】:
标签: haskell zip zip-conduit
官方示例将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 接收器来代替CB.sinkFile。
【讨论】: