1

也许只是我,我做错了什么,或者这可能是课程的预期结果,但我觉得它有问题......

我制作了以下测试存档(文件夹中也有文件,但它不应该与这个问题相关): 在此处输入图像描述

我使用以下方法提取单个文件(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;
    }
}

然后随着事件Extracting,我希望得到以下结果......FileExtractionStartedFileExtractionFinished

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

似乎即使我试图提取一个文件,它也在处理所有文件。当我尝试更大规模地使用它时(提取整个文件而不是单个文件),我将在根目录中有一个大文件和一堆小文件文件夹的存档,并在尝试时看到巨大的影响处理每个小文件(提取每个小文件所需的时间与提取存档根目录中的大文件所需的时间一样长。

用户是否有某种期望在内存流中设置搜索点或其他东西?我怎样才能让提取一个小文本文件不需要这么长时间?

4

2 回答 2

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
于 2020-02-21T15:35:58.450 回答
0

我是另一个 SevenZipSharp fork 的作者,终于来看看你的问题。仅尝试提取一个文件时收到如此多文件提取事件的原因是由于7z 存档是使用固态压缩创建的。

当您尝试从可靠存档中提取单个文件时,解压缩从文件的开头开始并遍历它,直到找到您要查找的文件。您的存档是最坏的情况,您要查找的文件位于存档的末尾(您的结果显示“New Text Document.txt”最后被提取)。

您的问题的解决方案取决于您最终需要实现什么,以及您在创建档案时拥有什么权力。如果您只需要提取一个文件,并且可以更改存档格式,那么我的目标是使用一些不使用固态压缩的格式(例如 zip)。如果您被迫使用 7z 文件,并且需要使用其中的几个文件,最好的办法可能是将它们全部解压缩到一个临时目录并在那里处理它们。

于 2021-04-12T21:40:39.540 回答