Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Haskell-LibZip编写zip文件?_Haskell_Zip - Fatal编程技术网

如何使用Haskell-LibZip编写zip文件?

如何使用Haskell-LibZip编写zip文件?,haskell,zip,Haskell,Zip,我试图找出Haskell中使用的一个非常简单的任务:如何打开归档文件foo.zip,将其解压缩,重新压缩,然后将其保存到新的归档文件bar.zip?有了这个库,这很容易: {-# LANGUAGE OverloadedStrings #-} import Codec.Archive.Zip (toArchive, fromArchive) import qualified Data.ByteString.Lazy as B import System.Environment saveZipA

我试图找出Haskell中使用的一个非常简单的任务:如何打开归档文件
foo.zip
,将其解压缩,重新压缩,然后将其保存到新的归档文件
bar.zip
?有了这个库,这很容易:

{-# LANGUAGE OverloadedStrings #-}

import Codec.Archive.Zip (toArchive, fromArchive)
import qualified Data.ByteString.Lazy as B
import System.Environment

saveZipAs :: FilePath -> FilePath -> IO () 
saveZipAs source dest = do
    arch <- fmap toArchive $ B.readFile source
    putStrLn "Archive info: " >> print arch
    B.writeFile dest $ fromArchive arch
{-#语言重载字符串}
导入Codec.Archive.Zip(到存档,来自存档)
将限定数据.ByteString.Lazy作为B导入
导入系统。环境
saveZipAs::文件路径->文件路径->IO()
saveZipAs source dest=do
拱门>打印拱门
B.writeFile dest$fromArchive arch
另一方面,LibZip没有提供明确的方法(我可以看到)。它似乎只能用
和archive
实例化一个zip文件(这本身就是一个问题,因为您要打开的文件可能不在磁盘上),而且我看不到一种方法来执行任何类型的“另存为”操作,也看不到通过testring或其他方式(如在zip中)将压缩字节提取为
。LibZip据说比Zip快,所以我想至少尝试一下,但它似乎更加晦涩难懂(而且也不纯,到处都带着一个
IO
,实际上只在开头和结尾需要它,如果有的话)。有人能给我一些提示吗


旁注:人们花这么多时间编写一个图书馆,却记录得如此糟糕,以至于没有人能使用它,这真让人难以置信。图书馆作家,请不要这样做

您的链接不知何故指向了该库的旧版本,而该库的最新版本似乎存在haddock编译错误

以下是更新版本中的文件读取功能:

相反的过程似乎是
addFile
/
sourceBuffer
和相关函数

以下是zip重新打包的完整源代码:

import Codec.Archive.LibZip
import Codec.Archive.LibZip.Types

main = readZip "foo.zip" >>= writeZip "bar.zip"

readZip :: FilePath -> IO [(FilePath, ZipSource)]
readZip zipName = withArchive [] zipName $ do
        nn <- fileNames []
        ss <- mapM (\n -> sourceFile n 0 (-1)) nn
        return $ zip nn ss

writeZip :: FilePath -> [(FilePath, ZipSource)] -> IO ()
writeZip zipName zipContent = withArchive [CreateFlag] zipName $ do
        mapM_ (uncurry addFile) zipContent
import Codec.Archive.LibZip
导入Codec.Archive.LibZip.Types
main=readZip“foo.zip”>>=writeZip“bar.zip”
readZip::FilePath->IO[(文件路径,ZipSource)]
readZip zipName=withArchive[]zipName$do
nn[(文件路径,ZipSource)]->IO()
writeZip zipName zipContent=withArchive[CreateFlag]zipName$do
mapM(uncurry addFile)zipContent

仍然可以进行的重构很少:
liftM2-zip
可以在
readZip
中使用,函数组合
可以在
writeZip
中使用。您的链接不知怎的指向了库的旧版本,而库的最新版本似乎有haddock编译错误

以下是更新版本中的文件读取功能:

相反的过程似乎是
addFile
/
sourceBuffer
和相关函数

以下是zip重新打包的完整源代码:

import Codec.Archive.LibZip
import Codec.Archive.LibZip.Types

main = readZip "foo.zip" >>= writeZip "bar.zip"

readZip :: FilePath -> IO [(FilePath, ZipSource)]
readZip zipName = withArchive [] zipName $ do
        nn <- fileNames []
        ss <- mapM (\n -> sourceFile n 0 (-1)) nn
        return $ zip nn ss

writeZip :: FilePath -> [(FilePath, ZipSource)] -> IO ()
writeZip zipName zipContent = withArchive [CreateFlag] zipName $ do
        mapM_ (uncurry addFile) zipContent
import Codec.Archive.LibZip
导入Codec.Archive.LibZip.Types
main=readZip“foo.zip”>>=writeZip“bar.zip”
readZip::FilePath->IO[(文件路径,ZipSource)]
readZip zipName=withArchive[]zipName$do
nn[(文件路径,ZipSource)]->IO()
writeZip zipName zipContent=withArchive[CreateFlag]zipName$do
mapM(uncurry addFile)zipContent

仍然可以进行一些重构:
liftM2-zip
可以在
readZip
中使用,函数组合
可以在
writeZip
中使用。提示:如果要检查包的其他版本,请按页面右上角的
contents
。然后,您将看到包含多个软件包版本的列表。提示:如果要查看软件包的其他版本,请按页面右上角的
contents
。然后你会看到包含多个软件包版本的列表。我认为这是不对的——尽管我可能错了。
fromFile
中的第二个参数说明它是归档文件中的文件名
sourceFile
看起来很有前途,只是它不返回
IO
,因此不能在
main
内部轻松使用(可能需要某种monad transformer体操?)。此外,它真的不清楚究竟什么是“源文件”。。。另外,
addFile
似乎用于将文件系统中的文件添加到归档文件中,我最终需要它,但不是现在。我甚至不知道
sourceBuffer
应该做什么。顺便说一句,我的挫败感只在于文档的质量,而不是你的帮助,我非常感谢你的帮助。:)添加了死亡简单任务的完整源代码。太棒了!这绝对比我目前的技能水平高了一点。也许你应该写一些文档!:)我认为那是不对的,尽管我可能错了。
fromFile
中的第二个参数说明它是归档文件中的文件名
sourceFile
看起来很有前途,只是它不返回
IO
,因此不能在
main
内部轻松使用(可能需要某种monad transformer体操?)。此外,它真的不清楚究竟什么是“源文件”。。。另外,
addFile
似乎用于将文件系统中的文件添加到归档文件中,我最终需要它,但不是现在。我甚至不知道
sourceBuffer
应该做什么。顺便说一句,我的挫败感只在于文档的质量,而不是你的帮助,我非常感谢你的帮助。:)添加了死亡简单任务的完整源代码。太棒了!这绝对比我目前的技能水平高了一点。也许你应该写一些文档!:)