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