我正在学习F#和Deedle。我正在尝试使用SharpZipLib提取这个TGZ文件的内容。我将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@()
这有帮助吗?
https://stackoverflow.com/a/52200001/1594263
看起来您应该使用CreateInputTarArchive((。我修改了您的示例以使用CreateInputTarArchive((,它对我有效
顺便说一句,你只是给out1分配了一个函数,实际上并没有调用ListContents((。
我不是SharpZipLib专家,但这对我有用:
use tar = TarArchive.CreateInputTarArchive(gSt, System.Text.Encoding.UTF8)
tar.ExtractContents(path, true)
我认为您必须明确地允许路径遍历解压缩为绝对路径。请参阅此文件中的SharpZipLib单元测试。