簡體   English   中英

為什么在嘗試提取單個文件時 SevenZipSharp.Interop NuGet 會提取多個文件?

[英]Why would the SevenZipSharp.Interop NuGet extract more than one file when trying to extract a single file?

也許這只是我一個人,我做錯了什么,或者這可能是課堂的預期結果,但我覺得有點不對勁……

我制作了以下測試存檔(文件夾中也有文件,但不應與此問題相關): 在此處輸入圖片說明

我使用以下方法提取單個文件( New Text Document.txt )...

#region SevenZipExtractor events
private void SevenZipExtractor_Extracting(object sender, ProgressEventArgs e)
{
    System.Diagnostics.Debug.WriteLine("SevenZipExtractor_Extracting -- " + e.PercentDone + "%");

    m_progress.UpdateProcessingStatus(e.PercentDone);
}

private void SevenZipExtractor_FileExtractionFinished(object sender, FileInfoEventArgs e)
{
    System.Diagnostics.Debug.WriteLine("SevenZipExtractor_FileExtractionFinished -- " + e.PercentDone + "% Filename:" + e.FileInfo.FileName);
}

private void SevenZipExtractor_FileExtractionStarted(object sender, FileInfoEventArgs e)
{
    System.Diagnostics.Debug.WriteLine("SevenZipExtractor_FileExtractionStarted -- " + e.PercentDone + "% Filename:" + e.FileInfo.FileName);
}
#endregion

private void DecompressThread()
{
    using (SevenZipExtractor extractor = new SevenZipExtractor(inStream))
    {
        extractor.Extracting += SevenZipExtractor_Extracting;
        extractor.FileExtractionStarted += SevenZipExtractor_FileExtractionStarted;
        extractor.FileExtractionFinished += SevenZipExtractor_FileExtractionFinished;

        using (FileStream file = new FileStream("C:\Sandbox\Z-Test\New Text Document.txt", FileMode.Create, FileAccess.Write))
        {
            extractor.ExtractFile(4, file);
        }

        extractor.Extracting -= SevenZipExtractor_Extracting;
        extractor.FileExtractionStarted -= SevenZipExtractor_FileExtractionStarted;
        extractor.FileExtractionFinished -= SevenZipExtractor_FileExtractionFinished;
    }
}

然后隨着事件ExtractingFileExtractionStartedFileExtractionFinished希望能得到以下結果......

SevenZipExtractor_FileExtractionStarted -- 100% Filename:New Text Document.txt
SevenZipExtractor_Extracting -- 100%
SevenZipExtractor_FileExtractionFinished -- 100% Filename:New Text Document.txt

但是,我得到以下結果......

SevenZipExtractor_Extracting -- 100%
SevenZipExtractor_Extracting -- 100%
SevenZipExtractor_FileExtractionStarted -- 20% Filename:Test Folder 1
SevenZipExtractor_FileExtractionFinished -- 20% Filename:Test Folder 1
SevenZipExtractor_FileExtractionStarted -- 40% Filename:Test Folder 2
SevenZipExtractor_FileExtractionFinished -- 40% Filename:Test Folder 2
SevenZipExtractor_FileExtractionStarted -- 60% Filename:Microsoft - Visual Studio 6 MSDN Library.iso
SevenZipExtractor_Extracting -- 1%
SevenZipExtractor_Extracting -- 2%
SevenZipExtractor_Extracting -- 3%
SevenZipExtractor_Extracting -- 4%
SevenZipExtractor_Extracting -- 5%
SevenZipExtractor_Extracting -- 6%
SevenZipExtractor_Extracting -- 7%
SevenZipExtractor_Extracting -- 8%
SevenZipExtractor_Extracting -- 9%
SevenZipExtractor_Extracting -- 10%
SevenZipExtractor_Extracting -- 11%
SevenZipExtractor_Extracting -- 12%
SevenZipExtractor_Extracting -- 13%
SevenZipExtractor_Extracting -- 14%
SevenZipExtractor_Extracting -- 15%
SevenZipExtractor_Extracting -- 16%
SevenZipExtractor_Extracting -- 17%
SevenZipExtractor_Extracting -- 18%
SevenZipExtractor_Extracting -- 19%
SevenZipExtractor_Extracting -- 20%
SevenZipExtractor_Extracting -- 21%
SevenZipExtractor_Extracting -- 22%
SevenZipExtractor_Extracting -- 23%
SevenZipExtractor_Extracting -- 24%
SevenZipExtractor_Extracting -- 25%
SevenZipExtractor_Extracting -- 26%
SevenZipExtractor_Extracting -- 27%
SevenZipExtractor_Extracting -- 28%
SevenZipExtractor_Extracting -- 29%
SevenZipExtractor_Extracting -- 30%
SevenZipExtractor_Extracting -- 31%
SevenZipExtractor_Extracting -- 32%
SevenZipExtractor_Extracting -- 33%
SevenZipExtractor_Extracting -- 34%
SevenZipExtractor_Extracting -- 35%
SevenZipExtractor_Extracting -- 36%
SevenZipExtractor_Extracting -- 37%
SevenZipExtractor_Extracting -- 38%
SevenZipExtractor_Extracting -- 39%
SevenZipExtractor_Extracting -- 40%
SevenZipExtractor_Extracting -- 41%
SevenZipExtractor_Extracting -- 42%
SevenZipExtractor_Extracting -- 43%
SevenZipExtractor_Extracting -- 44%
SevenZipExtractor_Extracting -- 45%
SevenZipExtractor_Extracting -- 46%
SevenZipExtractor_Extracting -- 47%
SevenZipExtractor_Extracting -- 48%
SevenZipExtractor_Extracting -- 49%
SevenZipExtractor_Extracting -- 50%
SevenZipExtractor_Extracting -- 51%
SevenZipExtractor_Extracting -- 52%
SevenZipExtractor_Extracting -- 53%
SevenZipExtractor_Extracting -- 54%
SevenZipExtractor_Extracting -- 55%
SevenZipExtractor_Extracting -- 56%
SevenZipExtractor_Extracting -- 57%
SevenZipExtractor_Extracting -- 58%
SevenZipExtractor_Extracting -- 59%
SevenZipExtractor_Extracting -- 60%
SevenZipExtractor_Extracting -- 61%
SevenZipExtractor_Extracting -- 62%
SevenZipExtractor_Extracting -- 63%
SevenZipExtractor_Extracting -- 64%
SevenZipExtractor_Extracting -- 65%
SevenZipExtractor_Extracting -- 66%
SevenZipExtractor_Extracting -- 67%
SevenZipExtractor_Extracting -- 68%
SevenZipExtractor_Extracting -- 69%
SevenZipExtractor_Extracting -- 70%
SevenZipExtractor_Extracting -- 71%
SevenZipExtractor_Extracting -- 72%
SevenZipExtractor_Extracting -- 73%
SevenZipExtractor_Extracting -- 74%
SevenZipExtractor_Extracting -- 75%
SevenZipExtractor_Extracting -- 76%
SevenZipExtractor_Extracting -- 77%
SevenZipExtractor_Extracting -- 78%
SevenZipExtractor_Extracting -- 79%
SevenZipExtractor_Extracting -- 80%
SevenZipExtractor_Extracting -- 81%
SevenZipExtractor_Extracting -- 82%
SevenZipExtractor_Extracting -- 83%
SevenZipExtractor_Extracting -- 84%
SevenZipExtractor_Extracting -- 85%
SevenZipExtractor_Extracting -- 86%
SevenZipExtractor_Extracting -- 87%
SevenZipExtractor_Extracting -- 88%
SevenZipExtractor_Extracting -- 89%
SevenZipExtractor_Extracting -- 90%
SevenZipExtractor_Extracting -- 91%
SevenZipExtractor_Extracting -- 92%
SevenZipExtractor_Extracting -- 93%
SevenZipExtractor_Extracting -- 94%
SevenZipExtractor_Extracting -- 95%
SevenZipExtractor_Extracting -- 96%
SevenZipExtractor_Extracting -- 97%
SevenZipExtractor_Extracting -- 98%
SevenZipExtractor_Extracting -- 99%
SevenZipExtractor_FileExtractionFinished -- 60% Filename:Microsoft - Visual Studio 6 MSDN Library.iso
SevenZipExtractor_FileExtractionStarted -- 80% Filename:New Microsoft Excel Worksheet.xlsx
SevenZipExtractor_FileExtractionFinished -- 80% Filename:New Microsoft Excel Worksheet.xlsx
SevenZipExtractor_FileExtractionStarted -- 100% Filename:New Text Document.txt
SevenZipExtractor_Extracting -- 100%
SevenZipExtractor_FileExtractionFinished -- 100% Filename:New Text Document.txt

似乎即使我試圖提取單個文件,它也正在處理所有文件。 當我嘗試更大規模地使用它時(提取整個文件而不是僅提取 1 個單個文件),我將擁有一個存檔,其中根目錄中有一個大文件和一堆小文件夾,並在嘗試時看到巨大的影響處理每個小文件(提取每個小文件所需的時間與提取存檔根目錄下的大文件所需的時間一樣長。

用戶是否有某種期望在內存流中設置搜索點? 我怎樣才能不花這么長時間提取一個小文本文件?

我已經向GitHub repo提交了一個 問題 在這一點上,我認為這要么是過去未解決的錯誤,要么是一次提取單個文件並不是提取整個存檔的預期方法。 在我的問題示例中,我的目標是嘗試從存檔中提取單個文件,而不用類處理整個文件(即使它最終只提取單個文件)。

在宏偉的計划中,我試圖手動提取一次處理一個文件的整個存檔(主要是因為我從引用的事件中獲得的消息沒有給我可靠的結果,例如一次只處理一個文件)。 這可能不是提取檔案的預期方法(也許只是另一種最終得到相同結果但從未使用過所以從未抱怨過的方法)。

我最終嘗試使用以下方法成功提取整個存檔。 從上述事件中獲取非常可靠的消息。 我還在這個示例中添加了更多內容(然后是我的問題中的內容)以使其完全運行代碼。 我錯誤地遺漏了問題中的inStream引用。

#region SevenZipExtractor events
private void SevenZip_Processing(object sender, ProgressEventArgs e)
{
    System.Diagnostics.Debug.WriteLine("SevenZip_Processing -- " + e.PercentDone + "%");

    m_progress.UpdateProcessingStatus(e.PercentDone);
}

private void SevenZipExtractor_FileExtractionFinished(object sender, FileInfoEventArgs e)
{
    System.Diagnostics.Debug.WriteLine("SevenZipExtractor_FileExtractionFinished -- " + e.PercentDone + "% Filename:" + e.FileInfo.FileName);
}

private void SevenZipExtractor_FileExtractionStarted(object sender, FileInfoEventArgs e)
{
    System.Diagnostics.Debug.WriteLine("SevenZipExtractor_FileExtractionStarted -- " + e.PercentDone + "% Filename:" + e.FileInfo.FileName);
}
#endregion

private void DecompressThread(string archiveFilePath)
{
    byte[] fileInBytes = File.ReadAllBytes(archiveFilePath);

    using (MemoryStream inStream = new MemoryStream(fileInBytes))
    {
        using (SevenZipExtractor extractor = new SevenZipExtractor(inStream))
        {
            extractor.Extracting += SevenZip_Processing;
            extractor.FileExtractionStarted += SevenZipExtractor_FileExtractionStarted;
            extractor.FileExtractionFinished += SevenZipExtractor_FileExtractionFinished;

            extractor.ExtractArchive("C:\Sandbox\Z-Test");

            extractor.Extracting -= SevenZip_Processing;
            extractor.FileExtractionStarted -= SevenZipExtractor_FileExtractionStarted;
            extractor.FileExtractionFinished -= SevenZipExtractor_FileExtractionFinished;
        }
    }
}

結果是……

SevenZipExtractor_FileExtractionStarted -- 11% Filename:Test Folder 1
SevenZipExtractor_FileExtractionFinished -- 11% Filename:Test Folder 1
SevenZipExtractor_FileExtractionStarted -- 22% Filename:Test Folder 2
SevenZipExtractor_FileExtractionFinished -- 22% Filename:Test Folder 2
SevenZipExtractor_FileExtractionStarted -- 33% Filename:Microsoft - Visual Studio 6 MSDN Library.iso
SevenZip_Processing -- 20%
SevenZip_Processing -- 40%
SevenZip_Processing -- 60%
SevenZip_Processing -- 80%
SevenZipExtractor_FileExtractionFinished -- 33% Filename:Microsoft - Visual Studio 6 MSDN Library.iso
SevenZipExtractor_FileExtractionStarted -- 44% Filename:New Microsoft Excel Worksheet.xlsx
SevenZipExtractor_FileExtractionFinished -- 44% Filename:New Microsoft Excel Worksheet.xlsx
SevenZipExtractor_FileExtractionStarted -- 56% Filename:New Text Document.txt
SevenZipExtractor_FileExtractionFinished -- 56% Filename:New Text Document.txt
SevenZipExtractor_FileExtractionStarted -- 67% Filename:Test Folder 1\New Text Document In TF1 - Copy.txt
SevenZipExtractor_FileExtractionFinished -- 67% Filename:Test Folder 1\New Text Document In TF1 - Copy.txt
SevenZipExtractor_FileExtractionStarted -- 78% Filename:Test Folder 1\New Text Document In TF1.txt
SevenZipExtractor_FileExtractionFinished -- 78% Filename:Test Folder 1\New Text Document In TF1.txt
SevenZipExtractor_FileExtractionStarted -- 89% Filename:Test Folder 2\New Text Document In TF2 - Copy.txt
SevenZipExtractor_FileExtractionFinished -- 89% Filename:Test Folder 2\New Text Document In TF2 - Copy.txt
SevenZipExtractor_FileExtractionStarted -- 100% Filename:Test Folder 2\New Text Document In TF2.txt
SevenZip_Processing -- 100%
SevenZipExtractor_FileExtractionFinished -- 100% Filename:Test Folder 2\New Text Document In TF2.txt

我是另一個 SevenZipSharp fork 的作者,終於有時間看看你的問題 僅嘗試提取一個文件時,您會收到如此多的文件提取事件,這是因為7z 檔案是使用Solid compression創建的。

當您嘗試從實體存檔中提取單個文件時,解壓縮從文件的開頭開始,並通過它直到找到您要查找的文件。 您的存檔是最壞的情況,您要查找的文件位於存檔的末尾(您的結果顯示“New Text Document.txt”最后被提取)。

您的問題的解決方案取決於您最終需要實現的目標,以及您對創建檔案的權力。 如果您只需要提取一個文件,並且可以更改存檔格式,我的目標是某種不使用可靠壓縮的格式(例如 zip)。 如果您被迫使用 7z 文件,並且需要使用多個文件,最好的方法可能是將它們全部提取到一個臨時目錄並在那里處理它們。

暫無
暫無

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

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