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);
}
`
Если у кого-то есть что-то получше, я все слышу, но это сработает для реализации индикатора выполнения.