这在很大程度上取决于您想要支持的文件格式(.zip、.tar.gz、tar.bz2 是最常见的),但您可以使用该zip-archive
库来创建 .zip 存档。这些档案是作为惰性字节字符串生成的,这意味着它们将即时生成。唯一棘手的部分是生成Archive
具有正确内容的类型值。例如,它可能看起来像这样:
import Codec.Archive.Zip
-- ... and in your code:
let archiveTemplate =
Archive
{ zComment = ByteString.pack "Downloaded from mysite.com"
, zSignature = Nothing
, zEntries = []
}
let filesIWantToInclude = ["foo.png", "bar.iso"]
entries <- forM filesIWantToInclude $ readEntry []
let archive = foldr addEntryToArchive archiveTemplate entries
let byteString = fromArchive archive
-- Now you can send the byteString over the network, or something.
如果您的文件系统上没有要压缩的文件,而是数据库中的文件或其他文件,则可以手动构建类型Entry
的值并填写正确的字段。您只需要一个惰性ByteString
表示您想要的数据压缩,仅此而已;然后您可以使用该toEntry
函数生成一个条目。值得一提的是,eRelativePath
in 字段Entry
是 .zip 存档中文件的相对路径,而不是文件系统中的实际相对路径。