无法使用 F# 和 SharpZipLib 提取 TGZ 文件的内容

Cannot extract the contents of a TGZ file using F# and SharpZipLib

我正在学习 F# 和 Deedle。我正在尝试使用 SharpZipLib 提取此 TGZ File 的内容。我将 TGZ 下载到我的本地驱动器。我认为我很接近,因为 out1 有效,但 out2 出错。我确信通过管道转发或组合可以更好地编写代码,但它首先需要工作。有人有什么想法吗?

open ICSharpCode.SharpZipLib.GZip
open  ICSharpCode.SharpZipLib.Tar

let extract path filename =
    let fullpath = Path.Combine(path, filename)
    let inSt = File.OpenRead(fullpath)
    let gSt = new GZipInputStream(inSt)
    let tar = TarArchive.CreateOutputTarArchive(gSt)
    let out1 = tar.ListContents
    let out2 = tar.ExtractContents(path)
    out2
    
extract "C:/Downloads/" "dragontail-12.4.1.tgz"

这是错误:

Error: System.NullReferenceException: Object reference not set to an instance of an object.
   at ICSharpCode.SharpZipLib.Tar.TarArchive.ExtractContents(String destinationDirectory, Boolean allowParentTraversal) in /_/src/ICSharpCode.SharpZipLib/Tar/TarArchive.cs:line 620
   at ICSharpCode.SharpZipLib.Tar.TarArchive.ExtractContents(String destinationDirectory) in /_/src/ICSharpCode.SharpZipLib/Tar/TarArchive.cs:line 600
   at FSI_0104.extract(String path, String filename)
   at <StartupCode$FSI_0104>.$FSI_0104.main@()

这有帮助吗?

看起来您应该使用 CreateInputTarArchive()。我修改了您的示例以使用 CreateInputTarArchive(),它对我有用。

顺便说一句,您只是将一个函数分配给 out1,您实际上并没有调用 ListContents()。

我不是 SharpZipLib 专家,但这对我有用:

use tar = TarArchive.CreateInputTarArchive(gSt, System.Text.Encoding.UTF8)
tar.ExtractContents(path, true)

我认为您必须明确允许路径遍历才能解压缩到绝对路径中。请参阅 this file.

中的 SharpZipLib 单元测试