Почему SevenZipSharp.Interop NuGet извлекает более одного файла при попытке извлечь один файл? - PullRequest
1 голос
/ 14 февраля 2020

Может быть, это только я, и я делаю что-то действительно неправильно, или, может быть, это ожидаемые результаты класса, но я упал, как будто что-то не так с ним ...

Я сделал следующий тестовый архив (в папках также есть файлы, но это не должно относиться к этому вопросу): enter image description here

Я использую следующий метод для извлечения одного 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;
    }
}

Затем с событиями Extracting, FileExtractionStarted и FileExtractionFinished я бы EXPECT вернул следующие результаты .. .

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

Кажется, что, хотя я пытаюсь извлечь один файл, он обрабатывает все файлы до этого момента. Когда я попытаюсь использовать это в большем масштабе (извлекая целый файл, а не только один файл), у меня будет архив с одним большим файлом в root и кучей небольших файловых папок, и я вижу огромное влияние, когда он пытается обработать каждый маленький файл (для извлечения каждого маленького файла требуется столько же времени, сколько и для большого файла в root архива.

Существует ли какой-либо тип ожидания для пользователя, чтобы установить точка поиска в потоке памяти или что-то в этом роде? Как сделать так, чтобы небольшой текстовый файл не занимал так много времени?

1 Ответ

1 голос
/ 21 февраля 2020

Я отправил вопрос в репозиторий GitHub . На данный момент я считаю, что это либо ошибка, которая не устранялась в прошлом, либо пошаговое извлечение одного файла за раз, не было предназначенным способом извлечения всего архива. В моем примере в вопросе я пытался извлечь отдельный файл из архива без обработки классом всего файла (хотя в конце он извлекает только один файл).

В общей схеме I пытался извлечь весь архив, обрабатывая по одному файлу за раз (в основном из-за того, что сообщения, которые я получал от событий, на которые ссылались, не давали мне надежных результатов, таких как ТОЛЬКО обработка одного файла за раз) вручную. Это может быть не тот метод, который предназначен для извлечения архива (может быть, просто другой путь, который приведет к тем же результатам, но никогда не использовался, поэтому никогда не жаловался).

В итоге я попытался извлечь весь архив, используя следующий метод с успехом. Получение очень надежных сообщений от событий, описанных выше. Я также добавил немного больше к этому примеру (то, что было в моем вопросе), чтобы сделать его полностью рабочим кодом. Я ошибочно пропустил ссылку 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
...