无法使用 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 单元测试
我正在学习 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 单元测试