C# sharpcompress: как проверить прогресс

IArchive rar = SharpCompress.Archive.Rar.RarArchive.Open(new FileInfo("ze.rar"), SharpCompress.Common.Options.None);
        rar.WriteToDirectory(Directory.GetCurrentDirectory() + "\\DATA", SharpCompress.Common.ExtractOptions.Overwrite);

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

1 ответ

Решение

Это должно предоставить пример того, как рассчитать текущий процент операции извлечения. Спасибо @MathiasRJessen за указание на поведение IArchive.WriteToDirectory расширение.

IArchive rar = SharpCompress.Archive.Rar.RarArchive.Open(new FileInfo("ze.rar"), SharpCompress.Common.Options.None);
string directory = Path.Combine(Directory.GetCurrentDirectory(), "DATA");

// Calculate the total extraction size.
double totalSize = rar.Entries.Where(e => !e.IsDirectory).Sum(e => e.Size);
long completed = 0;

// Use the same logic for extracting each file like IArchive.WriteToDirectory extension.
foreach (var entry in rar.Entries.Where(e => !e.IsDirectory))
{
    entry.WriteToDirectory(directory, ExtractOptions.Overwrite);

    // Track each individual extraction.
    completed += entry.Size;
    var percentage = completed / totalSize;
    // TODO do something with percentage.
}

На самом деле, я считаю, что этот код работает лучше, чем ответ.

Well, this was not properly documented anywhere on the Internet. There were some possibilities, but they wouldn't calculate properly. This is a working Progress percentage calculation for decompressing archives in SharpCompress.

Это взято из моего класса декомпрессии, поэтому в логике есть дополнительная информация. Однако важно преобразовать CompressedBytesRead в двойное значение и разделить его на общий размер архива, который также должен быть преобразован в двойной формат.

`

public static double Percentage {get; set;}

public static long totalSize { get; set; }

public static void BeginDecompression(string fullFileName, string fileName)
{
    try
    {               

        var settings = new Configuration().GetSettings();

        CurrentExtractionName = (Path.GetFileNameWithoutExtension(fileName)); 


        StringHelpers.ItemInfo item = StringHelpers.GetItemInfo(fileName);

        string extractPath = settings.EmbyAutoOrganizeFolderPath + "\\" +
                             (Path.GetFileNameWithoutExtension(fileName));
        Directory.CreateDirectory(extractPath);
        IArchive archive = ArchiveFactory.Open(fullFileName);

        // Calculate the total extraction size.
        totalSize = archive.TotalSize;

        Console.WriteLine(totalSize);

        foreach (IArchiveEntry entry in archive.Entries.Where(entry => !entry.IsDirectory))
        {
            archive.EntryExtractionEnd += FileMoveSuccess; 
            archive.CompressedBytesRead += Archive_CompressedBytesRead;
            entry.WriteToDirectory(extractPath, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);

        }

    }
    catch (Exception ex)
    {
        Console.WriteLine("Error: " + ex.Message);
    }
}

private static void Archive_CompressedBytesRead(object sender, CompressedBytesReadEventArgs e)
{            
    Percentage = ((double)e.CompressedBytesRead / (double)totalSize) * 100;

    Console.WriteLine(Percentage);
}

`

Если у кого-то есть что-то получше, я все слышу, но это сработает для реализации индикатора выполнения.

Другие вопросы по тегам