簡體   English   中英

無法使用 F# 和 SharpZipLib 提取 TGZ 文件的內容

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

我正在學習 F# 和 Deedle。 我正在嘗試使用 SharpZipLib 提取此TGZ 文件的內容。 我將 TGZ 下載到我的本地驅動器。 我認為我很接近,因為 out1 有效,但 out2 出錯。 我確信使用 pipe 轉發或組合可以更好地編寫代碼,但它首先需要工作。 有人有什么想法嗎?

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(),它對我有用。

順便說一句,您只是將 function 分配給 out1,您實際上並沒有調用 ListContents()。

我不是 SharpZipLib 專家,但這對我有用:

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

我認為您必須明確允許路徑遍歷才能解壓縮到絕對路徑中。 請參閱此文件中的 SharpZipLib 單元測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM