使用zip-conduit
库,我想从ZIP存档中提取单个文件(例如bar/foo.txt
)。
关于hackage的示例仅显示如何一次提取所有文件。如何只提取单个文件或文件列表?
注意:此问题是使用Q& A风格回答的,因此故意不会展示任何研究成果!
答案 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
。